- 安装selenium
pip --trusted-host pypi.tuna.tsinghua.edu.cn install selenium
pip --trusted-host mirrors.aliyun.com install cookielib
pip --trusted-host pypi.douban.com install cookielib
- 安装chromedriver
chromedriver下载地址
http://npm.taobao.org/mirrors/chromedriver/(可用)
注意 :chromedriver的版本要与你使用的chrome版本对应,note中有
解压的chromedriver.exe放进文件夹,再配置进path环境变量
- 如果环境变量未生效,可写入代码中
- ChromeDriverServer = '''C:\Users\pengzuo\AppData\Local\Google\Chrome\chromedriver.exe'''os.environ["webdriver.chrome.driver"] = ChromeDriverServer brguge = webdriver.Chrome(executable_path=ChromeDriverServer) brguge.get('https://www.baidu.com')#发送get请求input=brguge.find_element_by_id('kw')#找到目标
- 查找
Selenium-Webdriver
Intro:
Selenium是元素se(硒)。这个Selenium(以下简称Se)最开始只是一个自动化测试的项目,然后逐渐独立出来,并演化出了很多部分:Selenium IDE、Selenium Client API、Selenium Webdriver、Selenium Remote Control、Selenium Grid. Se对firefox支持较为友好!webdriver对firefox做了原生支持。并且Selenium IDE是firefox上的一个插件。可惜,Firefox更新了Quantum(57),大改了内核。目前Selenium IDE还是处在不适合当前版本的状态。
具体详见:https://www.cnblogs.com/yogayan/p/6710119.html
一、安装
这里安装的就是selenium Client API
python: pip install selenium
配合浏览器驱动:
chromedriver 欢迎大家FQ下载:https://sites.google.com/a/chromium.org/chromedriver/downloads。然后找个环境路径存一下就可以调用了。
IEdriver github下载:https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver 。 同样环境路径保存。
注意:IE玩家把internet选项-安全- 四个选项的启动保护模式都关掉!
PhantomJS 直接解压,把bin目录放在环境路径中
Opera以及geckodriver试了一下,对最新的opera和firefox都不怎么好使。当然可以下载较低的版本使用。(所以以下所有测试都选择了IE9)
二、基本使用
2.1 启动浏览器
from selenium import webdriver driver=webdriver.Ie() #或者webdriver.Chrome() driver.get('https://www.baidu.com') driver.page_source #拿到所有html内容,注意这里可能显示不全,因为网速跟不上程序嘛 driver.close() #关闭浏览器
** 2.2 常用接口**
from selenium import webdriver from selenium.webdriver import ActionChains #这个是模仿鼠标动作的 from selenium.webdriver.common.by import By #这个是设置查找方式的By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #这个是模拟键盘按键操作的 from selenium.webdriver.support import expected_conditions #这个是标注状态的 from selenium.webdriver.support.wait import WebDriverWait #这个是等待页面加载某些元素
2.3 选择器
1、find_element_by_id 按照id 查找 2、find_element_by_link_text 按照里面的文本查找,比如查找好呀find_element_by_link_text("好呀") 3、find_element_by_partial_link_text 按照文本的部分模糊查找,比如查找好呀find_element_by_link_text("好") 4、find_element_by_tag_name 按照标签名 5、find_element_by_class_name 按照类名 6、find_element_by_name 按照name属性查找 7、find_element_by_css_selector css选择器的方式查找 8、find_element_by_xpath/find_elements_by_xpath 比较神奇的查找方式
9、所有方式均可以用find_element(By.ID,"lala")这种形式替代
p.s. 一些方法取到的是元素集合,用索引或者for循环取单独的值。 下面是查找多个元素(这些方法将返回一个列表): find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector
a. 用contains关键字,定位代码如下: 1 driver.findElement(By.xpath(“//a[contains(@href, ‘logout’)]”));
这句话的意思是寻找页面中href属性值包含有logout这个单词的所有a元素,由于这个退出按钮的href属性里肯定会包含logout,所以这种方式是可行的,也会经常用到。其中@后面可以跟该元素任意的属性名。
b. 用start-with,定位代码如下: 1 driver.findElement(By.xpath(“//a[starts-with(@rel, ‘nofo’)]));
这句的意思是寻找rel属性以nofo开头的a元素。其中@后面的rel可以替换成元素的任意其他属性。
c. 用Text关键字,定位代码如下: 1 driver.findElement(By.xpath(“//*[text()=’退出’]));
这个方法可谓相当霸气啊。直接查找页面当中所有的退出二字,根本就不用知道它是个a元素了。这种方法也经常用于纯文字的查找。
另外,如果知道超链接元素的文本内容,也可以用 1 driver.findElement(By.xpath(“//a[contains(text(), ’退出’)]));
这种方式一般用于知道超链接上显示的部分或全部文本信息时,可以使用。
最后,关于xpath这种定位方式,webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素,所以这是一个非常费时的操作,如果你的脚本中大量使用xpath做元素定位的话,将导致你的脚本执行速度大大降低,所以请慎用。
8. By.cssSelector()
cssSelector这种元素定位方式跟xpath比较类似,但执行速度较快,而且各种浏览器对它的支持都相当到位,所以功能也是蛮强大的。
下面是一些常见的cssSelector的定位方式:
定位id为flrs的div元素,可以写成:#flrs 注:相当于xpath语法的//div[@id=’flrs’]
定位id为flrs下的a元素,可以写成 #flrs > a 注:相当于xpath语法的//div[@id=’flrs’]/a
定位id为flrs下的href属性值为/forexample/about.html的元素,可以写成: #flrs > a[href=”/forexample/about.html”]
如果需要指定多个属性值时,可以逐一加在后面,如#flrs > input[name=”username”][type=”text”]。
明白基本语法后,我们来尝试用cssSelector方式来引用图(3)中选中的那个input对象,代码如下: WebElement password = driver.findElement(By.cssSelector("#J_login_form>dl>dt>input[id=’ J_password’]"));
同样必须注意层级关系,这个不能省略。
cssSelector还有一个用处是定位使用了复合样式表的元素,之前在第4种方式className里面提到过。现在我们就来看看如何通过cssSelector来引用到第4种方式中提到的那个button。button代码如下: <button id="J_sidebar_login" class="btn btn_big btn_submit" type="submit">登录</button>
cssSelector引用元素代码如下: driver.findElement(By.cssSelector("button.btn.btn_big.btn_submit"))
。这样就可以顺利引用到使用了复合样式的元素了。
此外,cssSelector还有一些高级用法,如果熟练后可以更加方便地帮助我们定位元素,如我们可以利用^用于匹配一个前缀,$用于匹配一个后缀,*用于匹配任意字符。例如:
匹配一个有id属性,并且id属性是以”id_prefix_”开头的超链接元素:a[id^='id_prefix_']
匹配一个有id属性,并且id属性是以”_id_sufix”结尾的超链接元素:a[id$='_id_sufix']
匹配一个有id属性,并且id属性中包含”id_pattern”字符的超链接元素:a[id*='id_pattern']
最后再总结一下,各种方式在选择的时候应该怎么选择:
-
当页面元素有id属性时,最好尽量用id来定位。但由于现实项目中很多程序员其实写的代码并不规范,会缺少很多标准属性,这时就只有选择其他定位方法。
-
xpath很强悍,但定位性能不是很好,所以还是尽量少用。如果确实少数元素不好定位,可以选择xpath或cssSelector。
-
当要定位一组元素相同元素时,可以考虑用tagName或name。
-
当有链接需要定位时,可以考虑linkText或partialLinkText方式。