目录
selenium是一个用以操作浏览器的库,常被应用于自动化测试和爬虫。
先把相关的文档放上来:https://selenium-python.readthedocs.io/
因为最近使用这个模块比较多,所以分享其中的一些经验给大家。
模块的安装就不赘述了,但安装完模块以后需要同时安装对应浏览器的驱动,并放到python的文件目录下,才能正常的打开浏览器。
具体驱动的下载在上面的文档中可以找到。
selenium通过正确打开浏览器并成功打开对应网址之后,就可以进行对浏览器的操作了。
from selenium import webdriver
browser = webdriver.Chrome() #打开浏览器
browser.get('https://www.baidu.com/') #在浏览器中新开一个页面
浏览器中有各种各样的元素,我们需要通过selenium来实现点击、输入或者获取文本信息的功能,就需要首先定位到相关的元素;selenium提供了很多的元素定位的方法:
# selenium提供的元素定位的方法
## CSS选择器 相关的方法
browser.find_element_by_css_selector(selector) #匹配符合css选择器条件的元素
browser.find_element_by_class_name(name) #匹配class属性值元素
browser.find_element_by_id(id) #匹配id属性值的元素
browser.find_element_by_link_text(text) #完全匹配提供text的a元素
browser.find_element_by_partial_link_text(text) #包含提供的text的a元素
browser.find_element_by_name(name) #匹配name属性值的元素
browser.find_element_by_tag_name(name) #匹配标签name的元素(大小写无关,a匹配'a'和'A',div则匹配所有div元素)
## xpath 相关的方法
browser.find_element(s)_by_xpath() #匹配符合xpath路径的元素
每一个元素匹配的方法,都有find_element和find_elements的两个版本;
如果觉得定位元素太过复杂,就可以借助浏览器来获得帮助。
对着需要定位的元素点击 右键 --> 审查元素 -->选中元素对应html代码的左边的三个点
点击之后 --> Copy --> Copy selector或Copy Xpath
之后相应的CSS选择器或Xpath路径就已经复制到粘贴板上,将相应的CSS选择器复制到相应的函数中即可:
browser.find_element_by_css_selector("粘贴板上的CSS选择器")
browser.find_element_by_xpath("粘贴板上的Xpath路径")
如果运行之后显示选择器无效,可以尝试编辑一下选择器的内容,删除某个节点内容等,这很可能是版本不同而引起的。
前端知识预备:
content
#u1001{
/* CSS代码 */
}
browser.find_element_by_css_selector("#u1001") 匹配符合css选择器条件的元素
browser.find_element_by_id("u1001") 匹配id属性值的元素
content1
content2
content3
.item{
/* CSS代码 */
}
browser.find_element_by_css_selector(".item") 匹配符合css选择器条件的元素
browser.find_element_by_class_name("item") 匹配class属性值元素
- content1
- content2
- content3
- content4
li{
/* CSS代码 */
}
browser.find_element_by_css_selector("li") 匹配符合css选择器条件的元素
browser.find_element_by_tag_name("li")
1.相邻选择器
a. --> 对应的符号是 加号 +
b.用于选择某个元素后面相邻的元素
c.具体:
.box+p{
/* CSS代码 */
/* 这就选中了class="box"后面相邻的p元素 */
}
browser.find_element_by_css_selector(".box+p")
2.多元素选择器/组合选择器
a. --> 对应的符号是 逗号 ,
b.就逗号隔开多个元素,具体:
.box1,.box2,.box3{
/* CSS代码 */
/* 同时选中了class=box1或class=box2或class=box3的元素 */
}
.box1,p{
/* CSS代码 */
/* 同时选中了class=box1或元素标签为p的元素 */
}
browser.find_element_by_css_selector(".box1,.box2,.box3")
browser.find_element_by_css_selector(".box1,p")
3.后代选择器
a. --> 对应的符号是 空格 " "
b.后代指的是子元素,也同时可以是子子元素,以此类推
c.具体示例:
.box p{
/* CSS代码 */
/* 这就选中了.box 后代中所有的p元素,但并不选中.box元素 */
}
browser.find_element_by_css_selector(".box p")
4.子元素选择器
a. --> 对应的符号是 大于号 >
b.与后代类似,但不包含 子子元素 及 以后的
c.具体示例:
.box>p{
/* CSS代码 */
/* 这就选中了.box 元素的子元素(仅仅一代)中所有的p元素,但不选中.box元素 */
}
browser.find_element_by_css_selector(".box>p")
5.属性选择器
a. --> 对应的符号 双边框 [所选择属性名] // [属性名=属性值]同时指定属性及属性值
b.每个标签都可以有属性,例如 id属性、class属性、name属性、type属性、value属性等
属性选择器就可以选中,具有某个属性的元素
c.具体示例:
input[name]{
/* CSS代码 */
/* 这就选中了具有name属性的所有imput元素,无论这个name属性的值是什么 */
}
input[name=password]{
/* CSS代码 */
/* 这就选中了具有name属性的属性值为password的所有imput元素 */
}
input[name^=u]{
/* CSS代码 */
/* 这就选中了具有name属性的属性值为u开头的所有imput元素 */
}
input[name$=d]{
/* CSS代码 */
/* 这就选中了具有name属性的属性值为d结尾的所有imput元素 */
}
browser.find_element_by_css_selector("input[name]")
browser.find_element_by_css_selector("input[name=password]")
browser.find_element_by_css_selector("input[name^=u]")
browser.find_element_by_css_selector("input[name$=d]")
注:如果选中的class属性中,有指定多个属性,即class="c1 c2",就需要a[class^=c1]来选中元素
d.可以同时有多个选择条件
js='window.open("xxx.xxxx.com 可以为空字符串,空字符串则打开空的窗口");'
browser.execute_script(js)
如果需要定位的元素具有id属性,但id属性中含有一长串不规律的数字,那很可能就是动态 id了;我们也可以通过刷新网页来验证某id属性是否为动态id;如果遇到了动态id,则选择其他的定位方法即可,例如相邻选择器和后代选择器。
内嵌网页很好理解,就是在一个网页中嵌入了另外一个网页;而但我们browser获取的是外层网页的信息,就无法定位到内层网页中的元素;内嵌网页都是被一个iframe元素所包围的,所以我们需要先定位到这个iframe元素,接着再指定browser来跳转到iframe元素内的内嵌网页中来查找元素。
具体操作:
element = browser.find_element_by_css_selector("iframe") #第一步:定位iframe元素
browser.switch_to.frame(element) #第二步:跳转到内嵌网页中
# 现在就可以在内嵌网页中定位内嵌网页中的元素了
大部分网页的数据都是异步加载的,在我们操作网页的过程中,网页也在获取信息来生成其他的元素,如果我们需要定位的元素是异步生成的话,就需要等待数据传输;这个使用多使用一下time.sleep(1)和try-except来等待数秒就ok。