senlenium使⽤
⼀、浏览器操作
1、浏览器最⼤化
driver.maximize_window() #将浏览器最⼤化显⽰
2、设置浏览器宽、⾼
driver.set_window_size(480, 800)#设置浏览器宽480、⾼800显⽰
3、控制浏览器前进、后退
driver.back()#浏览器后退
driver.forward()#浏览器前进
⼆、简单对象的定位
webdriver 提供了⼀系列的元素定位⽅法,常⽤的有以下⼏种:
id
name
class name
tag name
link text
partial link text
xpath
css selector
分别对应python webdriver 中的⽅法为:
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
1、id 和name 定位
id 和name 是我们最常⽤的定位⽅式,因为⼤多数元素都有这两个属性,⽽且在对控件的id 和name
命名时⼀般使其有意义也会取不同的名字。通过这两个属性使我们⼀个页⾯上的属性变得相当容易。
⽐如:
#id=”gs_htif0”
find_element_by_id("gs_htif0")
#name=”btnK”
find_element_by_name("btnK")
2、tag name 和class name 定位
⽐如:
#<div id="searchform" class="jhp_big" >
#<form id="tsf" onsubmit="return name="f" method="GET" action="/search">
find_element_by_class_name("jhp_big")
find_element_by_tag_name("div")
tag name 定位应该是所有定位⽅式中最不靠谱的⼀种了,因为在⼀个页⾯中具有相同tag name 的元
素极其容易出现。
3、link text 与partial link text 定位
有时候需要操作的元素是⼀个⽂字链接,那么我们可以通过link text 或partial link text 进⾏元素
定位。⽐如:
复制代码
#<a href="news.baidu" name="tj_news">新闻</a>
#<a href="tieba.baidu" name="tj_tieba">贴吧</a>
#<a href="zhidao.baidu" name="tj_zhidao">⼀个很长的⽂字连接</a>
#通过link text 定位元素:
find_element_by_link_text("新闻")
find_element_by_link_text("贴吧")
find_element_by_link_text("⼀个很长的⽂字连接")
#通partial link text 也可以定位到上⾯⼏个元素:
find_element_by_partial_link_text("新")
find_element_by_partial_link_text("吧")
find_element_by_partial_link_text("⼀个很长的")
复制代码
当⼀个⽂字连接很长时,我们可以只取其中的⼀部分,只要取的部分可以唯⼀标识元素。⼀般⼀个页
⾯上不会出现相同的⽂件链接,通过⽂字链接来定位元素也是⼀种简单有效的定位⽅式。
4、XPath 定位
XPath 是⼀种在XML ⽂档中定位元素的语⾔。因为HTML 可以看做XML 的⼀种实现,所以selenium ⽤
户可是使⽤这种强⼤语⾔在web 应⽤中定位元素。
以下⾯⼀段html代码为例:
复制代码
<html class="w3c">
<body>
<div class="page-wrap">
<div id="hd" name="q">
<form target="_self" action="www.so/s">
<span id="input-container">
<input id="input" type="text" x-webkit-speech="" autocomplete="off" suggestwidth="501px" >
复制代码
(1)使⽤绝对路径定位:
当我们所要定位的元素很难到合适的⽅式时,都可以通这种绝对路径的⽅式位,缺点是当元素在很
多级⽬录下时,我们不得不要写很长的路径,⽽且这种⽅式难以阅读和维护。
find_element_by_xpath("/html/body/div[2]/form/span/input")
(2)使⽤相对路径定位:
find_element_by_xpath("//input[@id=’input’]") #通过⾃⾝的id 属性定位
find_element_by_xpath("//span[@id=’input-container’]/input") #通过上⼀级⽬录的id 属性定位
find_element_by_xpath("//div[@id=’hd’]/form/span/input") #通过上三级⽬录的id 属性定位
find_element_by_xpath("//div[@name=’q’]/form/span/input")#通过上三级⽬录的name 属性定位
通过上⾯的例⼦,我们可以看到XPath 的定位⽅式⾮常灵活和强⼤的,XPath 可以做布尔逻辑运算,例如://div[@id=’hd’ or @name=’q’]。当然,它的缺陷也⾮常明显:
1、性能差,定位元素的性能要⽐其它⼤多数⽅式差;
2、不够健壮,XPath会随着页⾯元素布局的改变⽽改变;
3. 兼容性不好,在不同的浏览器下对XPath 的实现是不⼀样的。
下⾯插播⼀下xpath的知识:
(1)路径表达式:
表达式描述
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()<3] 选取最前⾯的两个属于 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。
(2)选取未知节点
XPath 通配符可⽤来选取未知的 XML 元素。
通配符描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。
实例
在下⾯的表格中,我们列出了⼀些路径表达式,以及这些表达式的结果:
路径表达式结果
/bookstore/* 选取 bookstore 元素的所有⼦元素。
//* 选取⽂档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。
5、CSS 定位
CSS(Cascading Style Sheets)是⼀种语⾔,它被⽤来描述HTML 和XML ⽂档的表现。CSS 使⽤选择器来为页⾯元素绑定属性。这些选择器可以被selenium ⽤作另外的定位策略。CSS 可以⽐较灵活选择控件的任意属性,⼀般情况下定位速度要⽐XP
例如下⾯⼀段代码:
复制代码
<div class="formdiv">
<form name="fnfn">
<input name="username" type="text"></input>
<input name="password" type="text"></input>
<input name="continue" type="button"></input>
<input name="cancel" type="button"></input>
<input value="SYS123456" name="vid" type="text">
<input value="ks10cf6d6" name="cid" type="text">
</form>
<div class="subdiv">
<ul id="recordlist">
<p>Heading</p>
<li>Cat</li>
<li>Dog</li>
<li>Car</li>
<li>Goat</li>
</ul>
</div>
</div>
复制代码
通过CSS 语法进⾏匹配的实例:
关于⾃动化的定位问题:
⾃动化测试的元素定位⼀直是困扰⾃动化测试新⼿的⼀个障碍,因为我们在⾃动化实施过程中会碰到
各式各样的对象元素。虽然XPath 和CSS 可以定位到复杂且⽐较难定位的元素,但相⽐较⽤id 和name 来
说增加了维护成本和学习成本,相⽐较来说id/name 的定位⽅式更直观和可维护,有新的成员加⼊的⾃动
化时也增加了⼈员的学习成本。所以,测试⼈员在实施⾃动化测试时⼀定要做好沟通,规范前端开发⼈员
对元素添加id/name 属性,或者⾃⼰有修改HTML 代码的权限。
三、操作测试对象
⼀般来说,所有有趣的操作与页⾯交互都将通过WebElement 接⼝,包括上⼀节中介绍的对象定位,
以及本节中需要介绍的常对象操作。
webdriver 中⽐较常⽤的操作元素的⽅法有下⾯⼏个:
clear 清除元素的内容,如果可以的话
send_keys 在元素上模拟按键输⼊
click 单击元素
submit 提交表单
例如:
复制代码
driver.find_element_by_id("user_name").clear()
driver.find_element_by_id("user_name").send_keys("username")
driver.find_element_by_id("user_pwd").clear()
driver.find_element_by_id("user_pwd").send_keys("password")
driver.find_element_by_id("dl_an_submit").click()
#通过submit() 来提交操作
#driver.find_element_by_id("dl_an_submit").submit()
复制代码
clear() ⽤于清除输⼊框的默认内容
send_keys("xx") ⽤于在⼀个输⼊框⾥输⼊xx 内容
click() ⽤于单击⼀个按钮、连接等
submit() 提交表单
1、WebElement 接⼝常⽤⽅法
WebElement 接⼝除了我们前⾯介绍的⽅法外,它还包含了别⼀些有⽤的⽅法。下⾯,我们例举例⼏
个⽐较有⽤的⽅法。
size #返回元素的尺⼨
text #获取元素的⽂本
get_attribute(name) #获得属性值
is_displayed() #检查该元素是否⽤户可见
xpath语法 python例如:
size=driver.find_element_by_id("kw").size#返回百度输⼊框的宽⾼
text=driver.find_element_by_id("cp").text #返回百度页⾯底部备案信息
#返回元素的属性值,可以是id、name、type 或元素拥有的其它任意属性
attribute=driver.find_element_by_id("kw").get_attribute('type')
#返回元素的结果是否可见,返回结果为True 或False
result=driver.find_element_by_id("kw").is_displayed()
四、⿏标事件
前⾯例⼦中我们已经学习到可以⽤ click()来模拟⿏标的单击操作,⽽我们在实际的 web 产品测试中发现,有关⿏标的操作,不单单只有单击,有时候还要和到右击,双击,拖动等操作,这些操作包含在ActionChains 类中。ActionChains 类⿏标操作的常⽤⽅法:
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() ⿏标悬停在⼀个元素上
click_and_hold() 按下⿏标左键在⼀个元素上
1、右击操作
复制代码
#引⼊ ActionChains 类
from selenium.webdrivermon.action_chains import ActionChains
...
#定位到要右击的元素
right =driver.find_element_by_xpath("xx")
#对定位到的元素执⾏⿏标右键操作
ActionChains(driver).context_click(right).perform()
复制代码
ActionChains ⽤于⽣成⽤户的⾏为;所有的⾏为都存储在 actionchains 对象中。通过 perform()执⾏存储的⾏为。
2、⿏标双击操作
复制代码
#引⼊ ActionChains 类
from selenium.webdrivermon.action_chains import ActionChains
...
#定位到要双击的元素
double =driver.find_element_by_xpath("xxx")
#对定位到的元素执⾏⿏标双击操作
ActionChains(driver).double_click(double).perform()
复制代码
3、⿏标拖放操作
drag_and_drop(source, target)
在源元素上按下⿏标左键,然后移动到⽬标元素上释放。
source: ⿏标按下的源元素。
target: ⿏标释放的⽬标元素。
复制代码
#引⼊ ActionChains 类
from selenium.webdrivermon.action_chains import ActionChains
...
#定位元素的原位置
element = driver.find_element_by_name("xxx")
#定位元素要移动到的⽬标位置
target = driver.find_element_by_name("xxx")
#执⾏元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()
复制代码
4、⿏标移动上元素上
复制代码
#引⼊ ActionChains 类
from selenium.webdrivermon.action_chains import ActionChains
...
#定位到⿏标移动到上⾯的元素
above = driver.find_element_by_xpath("xxx")
#对定位到的元素执⾏⿏标移动到上⾯的操作
ActionChains(driver).move_to_element(above).perform()
复制代码
5、按下⿏标左键
复制代码
#引⼊ ActionChains 类
from selenium.webdrivermon.action_chains import ActionChains
...
#定位到⿏标按下左键的元素
left=driver.find_element_by_xpath("xxx")
#对定位到的元素执⾏⿏标左键按下的操作
ActionChains(driver).click_and_hold(left).perform()
复制代码
五、键盘事件
from selenium.webdrivermon.keys import Keys #在使⽤键盘按键⽅法前需要先导⼊ keys 类包。
下⾯经常使⽤到的键盘操作:
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter)
send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
六、获取页⾯的title和url
有时间需要通过页⾯的title和url去判断页⾯的状态。⽐如测试登录是否成功和重定向是否成功。
复制代码
#获得前⾯ title,打印
title = driver.title
print title
#获得前⾯ URL,打印
now_url = driver.current_url
print now_url
复制代码
七、设置等待时间
有时候为了保证脚本运⾏的稳定性,需要脚本中添加等待时间。
设置等待时间有以下⼏种⽅法:
sleep():设置固定休眠时间。 python 的 time 包提供了休眠⽅法 sleep() ,导⼊ time包后就可以使⽤ sleep()进⾏脚本的执⾏过程进⾏休眠。
implicitly_wait():是 webdirver 提供的⼀个超时等待。隐的等待⼀个元素被发现,或⼀个命令完成。如果超出了设置时间的则抛出异常。
WebDriverWait():同样也是 webdirver 提供的⽅法。在设置时间内,默认每隔⼀段时间检测⼀次当前页⾯元素是否存在,如果超过设置时间检测不到则抛出异常。
1、sleep()休眠⽅法
当执⾏到sleep()⽅法时会固定休眠⼀定的时长,然后再往下执⾏。sleep()⽅法以秒为单位,假如休眠时间⼩于 1 秒,可以⽤⼩数表⽰。
import time
....
time.sleep(5)
time.sleep(0.5)
当然,也可以直接导⼊ sleep()⽅法,使脚本中的引⽤更简单
from time import sleep
....
sleep(3)
sleep(30)
2、implicitly_wait()
隐式等待是通过⼀定的时长等待页⾯上某元素加载完成。如果超出了设置的时长元素还没被加载,则抛出NoSuchElementException异常。implicitly_wait()⽅法⽐ sleep() 更加智能,后者只能选择⼀个固定的时间的等待,前者可以在⼀个时间范围内智#添加智能等待30秒
driver.implicitly_wait(30)
3、WebDriverWait()
详细格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None),参数解释如下:
driver - WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)
timeout - 最长超时时间,默认以秒为单位
poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒
ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。
from selenium.webdriver.support.ui import WebDriverWait
....
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”))
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id(“someId”).is_displayed())
WebDriverWai()⼀般由 unit()或 until_not()⽅法配合使⽤,下⾯是 unit()和 until_not()⽅法的说明:
until(method, message=’’)
调⽤该⽅法提供的驱动程序作为⼀个参数,直到返回值不为False。
until_not(method, message=’’)
调⽤该⽅法提供的驱动程序作为⼀个参数,直到返回值为 False。
⼋、定位⼀组对象
需要获取页⾯上的⼀组元素是的⽅法:
复制代码
#find_elements ⽤于获取⼀组元素。
find_elements_by_id(‘xx’)
find_elements_by_name(‘xx’)
find_elements_by_class_name(‘xx’)
find_elements_by_tag_name(‘xx’)
find_elements_by_link_text(‘xx’)
find_elements_by_partial_link_text(‘xx’)
find_elements_by_xpath(‘xx’)
find_elements_by_css_selector(‘xx’)
复制代码
可以使⽤ in ...对这⼀组元素进⾏遍历
for checkbox in checkboxes:
checkbox.click()
我们获取到⼀组元素之后也可以使⽤pop()⽅法获得这⼀组元素中的第⼏个,然后再对该元素进⾏操作:
find_elements_by_id(‘xx’).pop().click()
pop()或pop(-1)默认获取⼀组元素中的最后⼀个
pop(0)  默认获取⼀组元素的第⼀个元素
pop(1)  默认获取⼀组元素的第⼆个元素
......以此类推
九、层级定位
在实际的项⽬测试中,经常会有这样的需求:页⾯上有很多个属性基本相同的元素,现在需要具体
定位到其中的⼀个。由于属性基本相当,所以在定位的时候会有些⿇烦,这时候就需要⽤到层级定位。先
定位⽗元素,然后再通过⽗元素定位⼦孙元素。
⽐如下拉列表,我们可以先点击弹出下拉框然后再定位下拉列表中的选项
#点击 Link1 链接(弹出下拉列表)
driver.find_element_by_link_text('Link1').click()
#在⽗亲元件下到 link 为 Action 的⼦元素
menu =
driver.find_element_by_id('dropdown1').find_element_by_link_text('Another
action')
⼗、多表单切换
在 web 应⽤中经常会出现 frame/iframe 表单内嵌套的应⽤,WebDriver只能在⼀个页⾯上进⾏元素识别定位,对于frame/iframe表单内嵌页⾯上的元素⽆法直接定位。这是需要通过switch_to.frame()⽅法将当前定位的主体切换为frame/iframe表单的内driver.switch_to_frame("f2")
switch_to.frame()默认可以直接去表单的id或name属性。如果没有这两个属性,可以通过其他⽅式定位,⽐如:
#先通过xpath定位到iframe
xf=driver.find_element_by_xpath('/*[@class="if"]')
#再将定位对象传给switch_to.frame()⽅法
driver.switch_to.frame()
如果完成了在当前表单上的操作,则可以通过switch_to.parent_content()⽅法跳出当前⼀集表单。该⽅法默认对应于离他最近的switch_to.frame()。如果要跳出最外层的页⾯使⽤switch_to.default_conent().
⼗⼀、多窗⼝切换
1、相关⽅法
current_window_handle:获得当前窗⼝句柄
window_handles:返回所有窗⼝的句柄到当前对话
switch_to.window(窗⼝句柄):切换到对应的窗⼝。
复制代码
nowhandle=driver.current_window_handle
driver.find_element_by_link_text(u"发表话题").click()
time.sleep(3)
#由于发表新话题会新窗⼝打开,所以要指向新窗⼝,即发话题窗⼝
allhandles=driver.window_handles
for handle in allhandles:
if(handle!=nowhandle):
driver.switch_to.window(handle)
复制代码
⼗⼆、警告窗处理
处理javascript所⽣成的alert、confirm、prompt,可以使⽤switch_to_alert()⽅法定位到alert/confirm/prompt,然后使⽤text/accept/dismiss/send_keys等⽅法进⾏操作
text    返回 alert/confirm/prompt 中的⽂字信息。
accept      点击确认按钮。
dismiss    点击取消按钮,如果有的话。
send_keys    输⼊值,这个 alert\confirm 没有对话框就不能⽤了,不然会报错。
⼗三、上传⽂件
1、查到input标签,通过send_keys添加⽂件路径
#通过查到input标签,然后send进去
driver.find_element_by_id("coverImgSrc").send_keys(u"%s"%tds["coverImgSrc"])
2、使⽤AutoIt识别flash控件和windows控件实现⾃动上传⽂件
⼗四、调⽤javascript
当 webdriver 遇到没法完成的操作时,笔者可以考虑借⽤ JavaScript 来完成。使⽤webdriver 提供的execute_script() 接⼝⽤来调⽤ js 代码。⽐如要操作页⾯上隐藏的元素,可以⽤javascript来把它设置为可见然后进⾏操作⽐如下⾯这段代码:
使⽤javascript:
复制代码
……
#修改元素的属性
js = 'document.querySelectorAll("select")[0].style.display="block";'
sel = driver.find_element_by_tag_name('select')
Select(sel).select_by_value('opel')
……
复制代码
⼗五、控制浏览器滚动条
⼀般⽤到操作滚动条的会两个场景:
注册时的法律条⽂的阅读,判断⽤户是否阅读完成的标准是:滚动条是否拉到最下⽅。
要操作的页⾯元素不在视觉范围,⽆法进⾏操作,需要拖动滚动条
⽤于标识滚动条位置的代码:
<body onload= "document.body.scrollTop=0 ">
<body onload= "document.body.scrollTop=100000 ">
如果滚动条在最上⽅的话, scrollTop=0 ,那么要想使⽤滚动条在最可下⽅,可以 scrollTop=100000 ,
这样就可以使滚动条在最下⽅。
复制代码
#将页⾯滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
time.sleep(3)
#将滚动条移动到页⾯的顶部
js1="var q=document.documentElement.scrollTop=0"
time.sleep(3)
复制代码
⼗六、获取元素对象的属性值
有时候我们定位页⾯上的元素发现常⽤的id、name等属性是相同的。这个时候我们只能通过常规的定位⽅法定位出⼀组元素,然后观察通过元素的属性可以定位出单个元素。可使⽤.get_attribute()⽅法。
⽐如:
复制代码
# 选择页⾯上所有的 tag name 为 input 的元素
inputs = driver.find_elements_by_tag_name('input')
#然后循环遍历出属性data-node值为594434493的元素,单击勾选
for input in inputs:
_attribute('data-node') == '594434493':
input.click()
……
复制代码
⼗七、获取验证码问题
关于验证码的处理,⽹上有⼏种说法:
1、测试时先去掉验证码
2、使⽤验证码识别技术
3、使⽤cookies记录登录⽤户名密码,下次⾃动登录免去验证码输⼊环节
我们⾃⼰内部的处理⽅式是内部提供⼀个接⼝获得验证码,然后通过js代码把获取的验证码填写进去:
#⾃动获取验证码并填写
js="$.getJSON('/util/getCode.jsonp?callback=?',function(data){$('.imgcode').de);})"

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。