Python Selenium入门学习材料整理
一、简介及环境搭建
1、selenium 介绍:selenium 是一个 web 的自动化测试工具,可以自动打开浏览器执行页面打开、页面内容抓取、页面元素搜索,是相对好上手的网页爬取工具。
2、安装selenium:pip install selenium
3、安装webdriver:selenium打开网页需要有webdriver来调用浏览器。
Firefox:https://github.com/mozilla/geckodriver/releases/
Chrome:https://sites.google.com/a/chromium.org/chromedriver/ 或者
http://chromedriver.storage.googleapis.com/index.html
IE:http://selenium-release.storage.googleapis.com/index.html
注意事项:
1)本机必须安装相应浏览器
2)webdriver一定和对应的浏览器版本,以及与selenium版本对应
3)下载webdriver到Python安装目录下
二、基本使用方法
1、启动浏览器,打开页面(我安装的firefox驱动,以下均以firefox为例)
from selenium import webdriver
browser = webdriver.Firefox()
browser.get(‘https://www.baidu.com/‘)
2、元素定位
webdriver常用定位方法如下:
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("https://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")
#通过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()
#等待3秒
time.sleep(3)
browser.quit()
经验说明:
1)以上定位方法id、name类的最直接,可直接定位到元素,但要保证页面上没有重复的,如不唯一要用elements取出一系列值后,根据索引号定位。
2)页面元素情况要先分析网页内容,如是动态网页,可以在要定位的内容上点右键用“查看无素”来查看动态页面内容。
3)xpath很强大,建议好好学学
三、操作动作
1、浏览器操作
浏览器最大化:browser.maximize_window()
浏览器最小化:browser.minimize_window()
设置浏览器宽480、高800:browser.set_window_size(480, 800)
浏览器前进:browser.forword()
浏览器后退:browser.back()
2、操作定位的对象
click()——点击对象
send_keys("输入的内容")——在对象上模拟按键输入,又如输入回车:send_keys(Keys.ENTER),ctrl+a:send_keys(Keys.CONTROL,‘a‘)
clear()——清除对象的内容
submit()——提交对象的内容
text——获取元素的文本信息
注:不一定所有定位的对象都能如上操作,要根据对象的特性选择
3、定位对象的属性值的获取:get_attribute
d=browser.find_element_by_xpath("//input[@id=‘kw‘]")
d.get_attribute("onclick")
即可取出input的onclick属性的值。
四、几个常见问题的处理方法
1、class含有空格时解决方法:
在实际进行元素定位时,class name常常是有多个class组合的复合名称,中间以空格隔开。如果直接用by_class进行定位会出现报错。
解决办法:
1)class属性唯一但是有空格,选择空格两边唯一的那一个
2)若空格隔开的class不唯一可以通过索引进行定位,例:self.driver.find_elements_by_class_name(‘table-dragColumn‘)[0].click()
3)通过css方法进行定位(空格以‘.’代替),例:
2、图形验证码问题:
网上查了很多,基本上都说用tesseract,经过实测,字母正排加线条点处理后还凑合能识别,要字母变型或旋转后基本识别不了。所以遇到这样的页面,还是用人工识别录入吧。
可以通过input把程序暂停住,人工处理完再继续。
例如:
code=input("请输入图形码内容:")
driver.find_element_by_id("checkCode").send_keys(code)
3、自动向下滚屏:
js="var q=document.documentElement.scrollTop=100000"
driver.execute_script(js)
注:有些动态页面下翻功能也不好用,一直没找到好的解决办法,只能用input暂停程序,手工翻到底,让动态页面完全加载。
4、多层框架/层级定位
如果页面存在iframe或有内嵌窗口,直接定位会出现定位不到的错误,解决方法如下:
iframe:
#先找到到 ifrome1(如果id = f1)
browser.switch_to_frame("f1")
内嵌窗口:
browser.switch_to_window("f1")
5、组合查找:
例如:driver.find_element_by_id(‘n1‘).find_element_by_tag_name(‘div‘).text
6、select 元素(下拉选项卡)的选择,可以用Select方法
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_name(‘selectname‘))
select.select_by_index(optionindex)
select.select_by_visible_text("optiontext")
select.select_by_value("optionvalue")
全部取消选择:select.deselect_all()
获取已选择列表:selectedoptions = select.all_selected_options
获取所有可选选项:options = select.options
7、Cookies处理
1)为页面添加 Cookies,用法如下
driver.get("http://www.123.com")
cookie = {‘name‘ : ‘user‘, ‘value‘ : ‘tom‘}
driver.add_cookie(cookie)
2)获取页面 Cookies,用法如下
driver.get("http://www.123.com")
driver.get_cookies()
7、xpath定位速查表
直接子元素 //div/a
子元素或后代元素 //div//a
以id定位 //div[@id=‘idValue‘]//a
以class定位 //div[@class=‘classValue‘]//a
同级弟弟元素 //ul/li[@class=‘first‘]/following
属性 //form/input[@name=‘username‘]
多个属性 //input[@name=‘continue‘ and
第4个子元素 //ul[@id=‘list‘]/li[4]
第1个子元素 //ul[@id=‘list‘]/li[1]
最后1个子元素 //ul[@id=‘list‘]/li[last()]
属性包含某字段 //div[contains(@title,‘Title‘)]
属性以某字段开头 //input[starts-with(@name,‘user‘)]
属性以某字段结尾 //input[ends-with(@name,‘name‘)]
text中包含某字段 //div[contains(text(), ‘text‘)]
元素有某属性 //div[@title]
父节点 //div/..
同级兄弟节点 //li/preceding-sibling::div[1]
8、xpath定位几个实例:
1)//td[@title=‘admin‘]/parent::tr # parent::tr表示定位节点的父节点,必须写明父组节点tr
或//td[@title=‘admin‘]/.. # ..在此处相当于parent::tr,此种方法简捷很多
2)following结合/、//的区别
following: 选取文档中当前节点的结束标签之后的节点。
//td[@title=‘admin‘]/following::label 表示选取td结束标签之后的label节点,不包括<td>至</td>中所有label子节点。即‘/‘ 表示从该节点后进行定位;
//td[@title=‘admin‘]//following::label 表示选取td结束标签之后的节点, 包括它自己的子节点。即‘//‘ 表示可以从td的任意一级子节点中进行定位,以及对td节点后进行定位。这时候可能会出现定位出多个节点,因为子节点中只要有label都是定位范围。
那如只想定位到第一个label节点,那就要用descendant::label才能准确定位到。
3)一个从后向前找的实例:
网页源码:
<div class="form-group">
<div class="label-cont label-ab">
<label for="">行业:</label>
</div>
<div class="form-cont content-ab">
<div class="multi-line-div" id="industry">工业</div>
</div>
</div>
目标:要定位到上面的label。
方法://div[@id="industry"]/parent::div/parent::div/descendant::label #向上找到爷爷辈,再到爷爷辈的子节点中查找label。
也可以写成://div[@id="industry"]/../../descendant::label
还可以写成://div[@id="industry"]/../../div/label
9、Xpath 的常见函数
last() 最后一个节点数
.//*[@id=‘select2-drop‘]/ul/li[last()]
参考资料:
1、Python+Selenium基础入门及实践(https://www.jianshu.com/p/1531e12f8852)
2、Python爬虫利器五之Selenium的用法(https://cuiqingcai.com/2599.html)
原文地址:https://www.cnblogs.com/tywusy/p/12134385.html