介绍
selenium
是一个 web 的自动化测试工具,可以模拟人工Web
浏览,, 适合用于自动化处理和爬虫任务, 该框架支持C、 java、ruby、python
等多种语言, 支持三大操作系统和各种常见浏览器
官方文档:
- https://selenium-python.readthedocs.io/index.html
- https://seleniumhq.github.io/selenium/docs/api/py/api.html
接下来以python
为例, 给大家介绍selenium
的具体使用
selenium
使用前准备
框架安装
1
pip install selenium
web
驱动安装推荐下载使用谷歌或火狐浏览器, 然后根据浏览器版本安装与之对应版本的驱动, 这里我使用的是谷歌浏览器
打开浏览器设置, 查看浏览器版本:
然后下载驱动:
将下载的驱动解压到以下目录:
1
2Win:复制webdriver到Python安装目录下
Mac:复制webdriver到/usr/local/bin目录下如果是火狐浏览器同理,以下是两大类浏览器驱动下载备用链接:
Chrome ( chromedriver ) Firefox ( geckodriver ) 官方下载 官方下载 淘宝镜像 淘宝镜像 备用下载 备用下载 接下来 我们开始引入框架并使用
框架引入
1
from selenium import webdriver
开始使用
自动打开浏览器访问某个网页
1
2
3
4from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com/')获取网页的源码
1
2
3
4
5from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com/')
print(browser.page_source)不打开浏览器获取网页源码
很多情况下我们只需要让程序在后台静默执行就行, 不需要频繁开启浏览器, 那么我们需要对驱动进行相关设置, 如下:
1
2
3
4
5
6
7
8
9
10
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)
browser.get('http://www.baidu.com/')
print(browser.page_source)以指定配置启动浏览器
常用浏览器有常用的一些设置, 如果我们想在自动化的过程中加载进来可以使用
add_argument
方法, 如下:1
2
3
4
5#coding=utf-8
from selenium import webdriver
option = webdriver.ChromeOptions()
option.add_argument('--user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data') #指定数据目录
driver=webdriver.Chrome(chrome_options=option)指定驱动的目录
除了将下载的驱动存放到系统指定目录使用之外, 我们还可以直接指定驱动的存放路径, 方便我们临时测试多个不同的驱动效果, 配置方法如下:
1
2
3driver_path = r'D:\ProgramApp\chromedriver\chromedriver.exe'
# 初始化一个driver,并且指定chromedriver的路径
driver = webdriver.Chrome(executable_path=driver_path)webdriver
常用api
汇总1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18browser = webdriver.Chrome()
browser.get_cookies() #获取所有的cookies
browser.page_source #获取网页源码
browser.delete_all_cookies() #删除所有cookies
browser.delete_cookie(key) #删除某个cookies
browser.implicitly_wait(10) #设置超时时间
browser.execute_script("window.open('https://www.douban.com/')") #打开一个新页面
browser.title #获取网页标题
browser.current_url #获取当前网页url
browser.capabilities['version'] #获取浏览器版本号
browser.maximize_window() #浏览器最大化
browser.minimize_window() #浏览器最小化
browser.set_window_size(480, 800) #设置浏览器宽高
browser.forword() # 页面前进
browser.back() #页面后退
browser.close() #关闭当前页面
browser.quit() #退出整个浏览器注意: 如果访问一些需要有
cookie
验证的页面,我们可以先访问主页,然后再访问详情页,webdriver
会自动携带cookie
ChromeOptions
常用函数汇总1
2#设置代理ip
options.add_argument("--proxy-server=http://110.73.2.248:8123")
网页元素定位查找
通过元素ID进行定位
1
browser.find_element_by_id()
通过标签名的方式进行定位
1
browser.find_element_by_tag_name("input")
通过
class
的方式进行定位1
browser.find_element_by_class_name("xxx")
通过
css
方式定位1
browser.find_element_by_css_selector("xxx")
事件模拟
主要分为键盘事件和鼠标事件
键盘事件
通过
send_keys()
调用键盘按键, 比如:1
2
3
4from selenium.webdriver.common.keys import Keys
send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回车参考代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys #需要引入 keys 包
import os,time
driver = webdriver.Firefox()
driver.get("http://passport.kuaibo.com/login/?referrer=http%3A%2F%2Fwebcloud .kuaibo.com%2F")
time.sleep(3)
driver.maximize_window() # 浏览器全屏显示
driver.find_element_by_id("user_name").clear()
driver.find_element_by_id("user_name").send_keys("fnngj")
#tab 的定位相相于清除了密码框的默认提示信息,等同上面的 clear()
driver.find_element_by_id("user_name").send_keys(Keys.TAB)
time.sleep(3)
driver.find_element_by_id("user_pwd").send_keys("123456")
#通过定位密码框,enter(回车)来代替登陆按钮
driver.find_element_by_id("user_pwd").send_keys(Keys.ENTER)
#也可定位登陆按钮,通过 enter(回车)代替 click()
driver.find_element_by_id("login").send_keys(Keys.ENTER)
time.sleep(3)
driver.quit()键盘组合键的用法:
1
2#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')1
2#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
鼠标事件
鼠标事件一般包括鼠标右键、双击、拖动、移动鼠标到某个元素上等等。 需要引入
ActionChains
类引入方法:
1
from selenium.webdriver.common.action_chains import ActionChains
ActionChains
常用方法:1
2
3
4
5
6
perform() 执行所有ActionChains 中存储的行为;
context_click() 右击;
double_click() 双击;
drag_and_drop() 拖动;
move_to_element() 鼠标悬停。鼠标双击示例:
1
2
3
4#定位到要双击的元素
qqq =driver.find_element_by_xpath("xxx")
#对定位到的元素执行鼠标双击操作
ActionChains(driver).double_click(qqq).perform()鼠标拖放示例:
1
2
3
4
5
6#定位元素的原位置
element = driver.find_element_by_name("source")
#定位元素要移动到的目标位置
target = driver.find_element_by_name("target")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()
特殊定位
iframe
定位1
2#先找到到 ifrome1(id = f1)
browser.switch_to_frame("f1")内嵌窗口定位:
1
browser.switch_to_window("f1")
附加内容
Python Webdriver Exception速查表
webdriver在使用过程中可能会出现各种异常,我们需要了解该异常并知道如何进行异常处理。
异常 描述 WebDriverException 所有webdriver异常的基类,当有异常且不属于下列异常时抛出 InvalidSwitchToTargetException 下面两个异常的父类,当要switch的目标不存在时抛出 NoSuchFrameException 当你想要用switch_to.frame()切入某个不存在的frame时抛出 NoSuchWindowException 当你想要用switch_to.window()切入某个不存在的window时抛出 NoSuchElementException 元素不存在,一般由find_element与find_elements抛出 NoSuchAttributeException 一般你获取不存在的元素属性时抛出,要注意有些属性在不同浏览器里是有不同的属性名的 StaleElementReferenceException 指定的元素过时了,不在现在的DOM树里了,可能是被删除了或者是页面或iframe刷新了 UnexpectedAlertPresentException 出现了意料之外的alert,阻碍了指令的执行时抛出 NoAlertPresentException 你想要获取alert,但实际没有alert出现时抛出 InvalidElementStateException 下面两个异常的父类,当元素状态不能进行想要的操作时抛出 ElementNotVisibleException 元素存在,但是不可见,不可以与之交互 ElementNotSelectableException 当你想要选择一个不可被选择的元素时抛出 InvalidSelectorException 一般当你xpath语法错误的时候抛出这个错 InvalidCookieDomainException 当你想要在非当前url的域里添加cookie时抛出 UnableToSetCookieException 当driver无法添加一个cookie时抛出 TimeoutException 当一个指令在足够的时间内没有完成时抛出 MoveTargetOutOfBoundsException actions的move操作时抛出,将目标移动出了window之外 UnexpectedTagNameException 获取到的元素标签不符合要求时抛出,比如实例化Select,你传入了非select标签的元素时 ImeNotAvailableException 输入法不支持的时候抛出,这里两个异常不常见,ime引擎据说是仅用于linux下对中文/日文支持的时候 ImeActivationFailedException 激活输入法失败时抛出 ErrorInResponseException 不常见,server端出错时可能会抛 RemoteDriverServerException 不常见,好像是在某些情况下驱动启动浏览器失败的时候会报这个错
Xpath&Css定位方法速查表
描述 Xpath Css 直接子元素 //div/a div > a 子元素或后代元素 //div//a div a 以id定位 //div[@id=’idValue’]//a div#idValue a 以class定位 //div[@class=’classValue’]//a div.classValue a 同级弟弟元素 //ul/li[@class=’first’]/following- ul>li.first + li 属性 //form/input[@name=’username’] form input[name=’username’] 多个属性 //input[@name=’continue’ and input[name=’continue’][type=’button 第4个子元素 //ul[@id=’list’]/li[4] ul#list li:nth-child(4) 第1个子元素 //ul[@id=’list’]/li[1] ul#list li:first-child 最后1个子元素 //ul[@id=’list’]/li[last()] ul#list li:last-child 属性包含某字段 //div[contains(@title,’Title’)] div[title*=”Title”] 属性以某字段开头 //input[starts-with(@name,’user’)] input[name^=”user”] 属性以某字段结尾 //input[ends-with(@name,’name’)] input[name$=”name”] text中包含某字段 //div[contains(text(), ‘text’)] 无法定位 元素有某属性 //div[@title] div[title] 父节点 //div/.. 无法定位 同级哥哥节点 //li/preceding-sibling::div[1] 无法定位
本文为作者原创转载时请注明出处 谢谢