selenium
(仅作为个人笔记,如有雷同,请联系删除。。)
1、Selenium的特点:
开源、免费,多浏览器支持,多平台支持,多语言支持,对Web页面有良好的支持,API简单,灵活(用开发语言驱动),支持分布式测试用例执行。
2、Windows下的测试环境搭建:
- 安装Python;
- 安装setuptools与pip(注:Python3不支持setuptools,但已经集成了pip)
- 安装Selenium:
pip install Selenium
指定版本号安装:
pip install selenium==版本号
查看当前包的版本信息:pip show selenium
卸载当前安装包:pip uninstall selenium
3、前端工具:
-
FireBug:可通过它方便的查看页面上的元素,从而根据其属性进行定位。
安装: Firfox浏览器菜单栏—>tools—>add-ons
Manager[添加组件]—>搜索FireBug—>安装—>重启浏览器—>工具栏中可看到FireBug按钮 -
FirePath:编辑、检查和生成XPath1.0表达式、CSS 3选择器以及jQuery选择器;可帮助我们通过XPath和CSS来快速定位页面上的元素
安装:与FireBug类似
-
Chrome开发人员工具:Chrome浏览器—>右上角菜单—>工具—>开发人员工具。【F12,较为常用】
-
IE 开发人员工具:IE浏览器—>F12 / 右上角工具—>F12开发人员工具
4、实例:编写第一个自动化脚本
# coding=utf-8 // # _*_coding:utf-8_*_也可以 # 声明编码类型,py2需要,py3不需要
from selenium import webdriver # 导入webdriver包
driver = webdriver.Firefox() # 获取浏览器驱动
# driver = webdriver.Chrome()
# driver = webdriver.Ie()
driver.get("http://www.baidu.com") # 通过get()方法,向浏览器发送网址
driver.find_element_by_id("kw").send_keys("daqiang") # 定位百度的输入框并输入内容
driver.find_element_by_id("su").click() # 定位“百度一下”搜索按钮并点击
driver.quit() # 退出并关闭浏览器及相关的驱动程序
-
Firefox浏览器驱动默认已经在webdriver中,可直接调用;IE和Chrome的浏览器驱动需要另行下载安装
注:各个浏览器驱动下载地址:http://www.seleniumhq.org/download/
-
Chrome浏览器驱动—>下载ChromeDriver_win64.zip,解压得到Chromedriver.exe,放到D:\python\目录下(因为D:\python已经添加到系统环境变量Path下)
-
IE浏览器驱动—>下载IEDriverServer_Win64_x.xx.zip,解压得到IEDriverServer.exe—>同上
5、WebDriver提供的8种元素定位的方法:
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off"> #百度的输入框
<input id="su" value="百度一下" class="bg s_btn" type="submit"> # 百度的搜索按钮
-
find_element_by_id():通过id属性来定位元素(id属性是唯一的)
eg:find_element_by_id(“kw”)—>百度的输入框
-
find_element_by_name():通过name属性来定位元素
eg:find_element_by_name(“wd”)—>百度的输入框
-
find_element_by_class_name():通过class属性来定位元素(HTML中,class属性指定元素的类名)
eg:find_element_by_class_name(“s_ipt”)—>百度的输入框
-
find_element_by_tag_name():通过标签名来定位元素(很难用来定位),
eg:find_element_by_tag_name(“input”)—>可以是输入框,也可以是搜索按钮,无法区分到底是输入框还是搜索按钮,不能用来定位
-
find_element_by_link_text():专门用来定位文本链接,通过链接元素标签对之间的文本来定位元素
eg:百度输入框上面的几个文本链接代码如下:<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a> --->find_element_by_link_text("新闻") <a href="https://www.hao123.com" name="tj_trhao123" class="mnav">hao123</a> --->find_element_by_link_text("hao123") <a href="http://map.baidu.com" name="tj_trmap" class="mnav">地图</a> --->find_element_by_link_text("地图") <a href="http://v.baidu.com" name="tj_trvideo" class="mnav">视频</a> --->find_element_by_link_text("视频") <a href="http://tieba.baidu.com" name="tj_trtieba" class="mnav">贴吧</a> --->find_element_by_link_text("贴吧")
-
find_element_by_partial_link_text():通过链接元素标签对之间的部分文本来定位元素
eg:有一个链接标签:<a href="。。。" name="tj_trtieba" class="mnav">一个很长很长的文本链接</a>
对其定位:—>find_element_by_partial_link_text(“一个很长很长的”)
-
find_element_by_xpath():XPath定位
(1). 绝对路径定位:XPath的绝对路径定位,主要用标签名的层级关系来定位元素的绝对路径,“div[2]”表示当前层级下的第二个div标签
eg:find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
,百度的输入框find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span[2]/input")
,百度搜索按钮
(2). 利用元素属性定位:- XPath的绝对路径定位,主要用标签名的层级关系来定位元素的绝对路径,“div[2]”表示当前层级下的第二个div标签
eg:find_element_by_xpath("//input[@id='kw']")
、
find_element_by_xpath("//input[@name='wd']")
—>百度输入框find_element_by_xpath("//input[@class='s_ipt']")
- 如果不想指定标签名,也可以用*代替
eg:find_element_by_xpath("//*[@class='bg s_btn']")
—>百度搜索按钮
(3). 层级与属性结合:如果父级元素没有可利用的属性值,可以继续向上找“爷爷”级元素
eg:find_element_by_xpath("//span[@class='bg s_ipt_wr']/input")
注:span[@class='bg s_ipt_wr']通过class属性定位到父级元素,后面的/input表示父级元素下面的子元素
(4). 使用逻辑运算符and:也可以用“and”连接更多的属性来唯一的标识一个元素。
eg:find_element_by_xpath("//input[@id='kw' and @class='su']")
—>同时使用id和class唯一的标识这个元素
(5). 补充:contains的用法:a[contains(@href, 'NameOnly')]
,表示选取href中包含NameOnly的a元素
(6). 补充:定位当前元素的兄弟元素:../div[@="class"]/preceding-sibling::div[1] ,前一位 ../div[@="class"]/following-sibling::div[1] ,后一位 ../div[@="class"]/preceding-sibling::div[N] ,前n位 ../div[@="class"]/following-sibling::div[N] ,后n位
(7). 补充:定位当前元素的父元素:
..
表示选取当前节点的父节点
eg://tbody/tr/td/a[contains(@href,'NameOnly')]``/../..``/td[2]
(8). 补充1:在Firefox浏览器中,点击FireBug插件左上角的鼠标箭头,再单击网页上需要定位的元素,在元素行上右键弹出快捷菜单,选择“复制XPath”,将会获得当前元素的XPath语法。
(9). 补充2:在Firefox浏览器中,使用FirePath插件,选中元素后,直接在XPath的输入框中生成当前元素的XPath语法。 - XPath的绝对路径定位,主要用标签名的层级关系来定位元素的绝对路径,“div[2]”表示当前层级下的第二个div标签
-
find_element_by_css_selector():CSS定位(CSS:层叠样式表)
element_by_css_selector(".class属性值")
--------->通过class属性定位
eg:find_element_by_css_selector(".s_ipt")—>百度输入框find_element_by_css_selector("#id值")
---------->通过id属性定位
eg:find_element_by_css_selector("#kw")—>百度输入框find_element_by_css_selector("*")
-------------->选择所有元素find_element_by_css_selector("标签名")
---------->通过标签名定位,但很难找到想要的元素
eg:find_element_by_css_selector(“input”)find_element_by_css_selector("父标签名>子标签名")
---------->通过父子关系定位,定位子元素
eg:find_element_by_css_selector(“span>input”)—>查找父元素为span,本身标签名为input的子元素find_element_by_css_selector("[属性=属性值]")
------------->通过属性定位,属性值可加引号,也可不加,但要与外面的引号区分开
eg:find_element_by_css_selector("[type=‘submit’]")find_element_by_css_selector("父标签名.class属性值>子标签名.class属性值")
—>组合定位,将前面的定位策略组合起来使用
eg:find_element_by_css_selector(“span.bg s_ipt_wr>input…s_ipt”) 注:定位的还是子元素- 补充:可使用FireBug工具辅助生成CSS语法,通过FireBug定位元素,在元素上右键,选择“复制CSS路径”。
- 补充:也可使用FirePath插件辅助生成CSS语法。
6、用By定位元素:针对上面的8种定位方法,提供的另一套写法——即统一调用find_element()方法,通过By来声明定位的方法,并且传入对应定位方法的定位参数。
from selenium.webdriver.common.by import By
find_element(By.ID, "id属性值")
find_element(By.NAME, "name属性值")
find_element(By.CLASS_NAME, "class属性值")
find_element(By.TAG_NAME, "标签名")
find_element(By.LINK_TEXT, "链接元素标签对之间的文本内容")
find_element(By.PARTIAL_LINK_TEXT, "链接元素标签对之间的部分文本")
find_element(By.XPATH, "XPath语法")
find_element(By.CSS_SELECTOR, "css语法")
> 注:find\_element()方法需要两个参数,第一个参数为定位类型,由By提供,第二个参数为定位参数
7、控制浏览器:
-
控制浏览器窗口大小:
set_window_size(宽,高)
全屏显示:maximize_window()
—>不需要参数# 举例:控制浏览器窗口大小 from selenium import webdriver driver = webdriver.Firefox() driver.get("http://m.mail.10086.cn") print("设置为移动端大小:宽480,高800显示") driver.set_window_size(480, 800) # driver.maximize_window() driver.quit()
-
使用后退和前进按钮在浏览过的网页之间切换:
back()
--------->后退
forward()
----->前进# 举例:使用后退和前进按钮在浏览过的网页之间切换 from selenium import webdriver driver = webdriver.Firefox() first_url='http://www.baidu.com' print("now: %s" % first_url) driver.get(first_url) second_url='http://news.baidu.com' print("now: %s" % second_url) driver.get(second_url) print("back to: %s" % first_url) driver.back() # 回退 print("forward to : %s" % second_url) driver.forward() # 前进 driver.quit()
-
模拟浏览器刷新:
driver.refresh()
----->刷新当前页面
8、简单元素操作:
clear()
:清除文本send_keys(*value)
:模拟按键输入click()
:单击元素
# eg:126邮箱登录:
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.126.com")
driver.find_element_by_id("idInput").clear() #清除文本输入框的内容(默认提示信