selenium
selenium 是一个 web 的自动化测试工具 ,我这里主要用它进行爬虫,因为传统的requests只能爬去静态网页的内容,而很多内容需要进入网页加载后才能显示,例如处理弹窗等等。
安装
安装库:
pip install selenium
安装 webdriver :
webdriver 相当于一个浏览器的内核。各大浏览器都可以下载。
Chrome 的下载地址:
https://sites.google.com/a/chromium.org/chromedriver/
or
http://chromedriver.storage.googleapis.com/index.html
注意 webdriver需要和对应的浏览器版本以及selenium版本对应
Webdriver版本 | 支持的Chrome版本 |
---|---|
v2.41 | v67-69 |
v2.40 | v66-68 |
v2.39 | v66-68 |
v2.38 | v65-67 |
v2.37 | v64-66 |
v2.36 | v63-65 |
v2.35 | v62-64 |
v2.34 | v61-63 |
v2.33 | v60-62 |
然后讲下载的 webdriver 放在python的根目录即可。
启动
普通启动
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com/')
Headless启动
即无形启动,官方文档中介绍,mac和linux环境要求chrome版本是59+,而windows版本的chrome要求是60+,同时chromedriver要求2.30+版本。
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
# 使用headless无界面浏览器模式
chrome_options.add_argument('--headless') //增加无界面选项
chrome_options.add_argument('--disable-gpu') //如果不加这个选项,有时定位会出现问题
# 启动浏览器,获取网页源代码
browser = webdriver.Chrome(chrome_options=chrome_options)
mainUrl = "https://www.taobao.com/"
browser.get(mainUrl)
print(f"browser text = {browser.page_source}")
browser.quit()
元素定位
-
id定位:find_element_by_id()
-
name定位:find_element_by_name()
-
class定位:find_element_by_class_name()
-
link定位:find_element_by_link_text()
-
partial link定位:find_element_by_partial_link_text()
-
tag定位:find_element_by_tag_name()
-
xpath定位:find_element_by_xpath()
-
css定位:find_element_by_css_selector()
#coding=utf-8
from selenium import webdriver
browser=webdriver.Firefox()
browser.get("http://www.baidu.com")
#########百度输入框的定位方式##########
#通过id方式定位
browser.find_element_by_id("kw").send_keys("selenium")
#通过name方式定位
browser.find_element_by_name("wd").send_keys("selenium")
#通过tag name方式定位
browser.find_element_by_tag_name("input").send_keys("selenium")
#通过partial link定位
browser.find_element_by_partial_link_text("教务").send_keys("selenium")
#通过class name方式定位
browser.find_element_by_class_name("s_ipt").send_keys("selenium")
#通过CSS方式定位
browser.find_element_by_css_selector("#kw").send_keys("selenium")
#通过xpath方式定位
browser.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
############################################
browser.find_element_by_id("su").click()
time.sleep(3)
browser.quit()
xpath定位
XPath 是一门在 XML 文档中查找信息的语言。
个人认为xpath定位方法比较全能。
- 选取节点
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
… | 选取当前节点的父节点。 |
@ | 选取属性。 |
路径表达式 | 结果 |
---|---|
bookstore | 选取 bookstore 元素的所有子节点。 |
/bookstore | 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素。 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置。 |
bookstore//book | 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 |
//@lang | 选取名为 lang 的所有属性。 |
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()❤️] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang=‘eng’] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
- 选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
路径表达式 | 结果 |
---|---|
/bookstore/* | 选取 bookstore 元素的所有子元素。 |
//* | 选取文档中的所有元素。 |
//title[@*] | 选取所有带有属性的 title 元素。 |
- 选取若干路径
路径表达式 | 结果 |
---|---|
//book/title | //book/price | 选取 book 元素的所有 title 和 price 元素。 |
//title | //price | 选取文档中的所有 title 和 price 元素。 |
/bookstore/book/title | //price | 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。 |
当class含有空格
#前面加(.)空格地方用点(.)来代替
self.driver.find_element_by_css_selector('.dtb-style-1.table-dragColumns').click()
等待
强制等待
sleep()
隐性等待
在一个时间范围内智能等待
# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(30) # 隐性等待,最长等30秒
driver.get('http://baidu.com')
print(driver.current_url)
driver.quit()
显性等待
就是每隔几秒看看加载完没有
方法略
浏览器的控制
设置浏览器大小
browser.maximize_window() #最大化
browser.minimize_window() #最小化
browser.set_window_size(480, 800) #设置浏览器宽480、高800显示
浏览器前进后退
browser.forword() #前进
browser.back() #后退
操作对象的几种方法
- click——点击对象
- send_keys——在对象上模拟按键输入
- clear——清除对象的内容,如果可以的话
- submit——提交对象的内容,如果可以的话
- text——用于获取元素的文本信息
控制键盘
要想调用键盘按键操作需要引入 keys 包
from selenium.webdriver.common.keys import Keys
send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回车
#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
控制鼠标
引入方法
from selenium.webdriver.common.action_chains import ActionChains
ActionChains 常用方法:
perform() #执行所有ActionChains 中存储的行为;
click() #单机鼠标右箭
context_click() #右击;
double_click() #双击;
drag_and_drop() #拖动;
move_to_element() #鼠标悬停。
实例:
#定位到要双击的元素
qqq =driver.find_element_by_xpath("xxx")
#对定位到的元素执行鼠标双击操作
ActionChains(driver).double_click(qqq).perform()
#定位元素的原位置
element = driver.find_element_by_name("source")
#定位元素要移动到的目标位置
target = driver.find_element_by_name("target")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()
定位到新页面
有时候点击进入一个新页面,需要利用窗口话柄定位到新的页面。
browser.switch_to.window(browser.window_handles[1])
定位下拉框
定位select类型下拉框
from selenium.webdriver.support.ui import Select
# 通过index进行选择
Select(driver.find_element_by_name("form:j_idt163")).select_by_index(1)
# 通过value进行选择
Select(driver.find_element_by_name("form:j_idt163")).select_by_value("中风险")
# 通过选项文字进行选择
Select(driver.find_element_by_name("form:j_idt163")).select_by_visible_text("低风险")
selenium的拓展——appium
手机app自动化,也是十分强大,后期需要再研究。