WebDriver API--元素定位
WebDriver属于Selenium体系中设计出来操作浏览器的一套API,
站在WebDriver的角度, 因为它针对多种编程语言都实现了一遍这套API,所以它可以支持多种编程语言;
站在编程语言的角度,WebDriver是Python的一个用于实现Web自动化的第三方库。
一、元素定位
正常一个页面包含的元素,有输入框、按钮、文本链接、图片等,自动化要做的就是模拟鼠标和键盘来操作这些元素,单击、输入或鼠标悬停。
而操作这些元素的前提是我们需要找到它们,
WebDriver提供了八种元素定位方法,在Python语言中对应的方法如下:
属性
|
方法
|
ID
|
find_element_by_id('xx')
|
name
|
find_element_by_name('xx')
|
class
|
find_element_by_class_name('xx')
|
tag
|
find_element_by_tag_name('xx')
|
link
|
find_element_by_link_text()
|
partial linke
|
find_element_by_partial_link_text()
|
xpath
|
find_element_by_xpath()
|
css selector
|
find_element_by_css_selector()
|
ID、name、class、tag
link
用于定位页面上的文本链接,如百度<a class="" href="">贴吧</a>,那么link定位:find_element_by_link_text("贴吧")
partial link
定位是对link的补充,可以去文本链接的一部分定位,如百度<a class="" href="">贴吧</a>,那么link定位:find_element_by_link_text("贴")或者find_element_by_link_text("吧")
XPath
在XML文档中定位元素的语言,可以利用绝对路径定位、元素属性定位、层级与属性结合,
绝对路径,如百度首页的输入框driver.find_element_by_xpath("/html/body/div/div/div/div/div/form/span/input")——浏览器及版本不同,xpath的绝对路径可能不同,可以直接在浏览器F12定位到右键复制xpath;
元素属性定位,如百度的搜索按钮driver.find_element_by_xpath("//*[@id='su']");
css selector
定位页面的css元素
-
find_element_by_css_selector("."),通过class属性定位
-
find_element_by_css_selector("#"),通过id属性定位
-
find_element_by_css_selector("input")直接通过标签名定位,但是同一标签名在页面上重复的几率很大,很难被定位到想要的元素
为了通过标签定位提升被找到的成功率,有以下几个方法,{1.通过父子关系定位;2.通过属性定位;3.组合定位}
-
父子关系定位,find_element_by_css_selector("span>input")
-
属性定位,find_element_by_css_selector("[name='kw']")
-
组合定位,find_element_by_css_selector("span.bg s_btn_wr>input#su"),有个父元素标签是span,它的class属性是bg s_btn_wr,子元素标签名是input,id是su
以上可以发现,XPath和css selector两种方法整合了id、class等查找方式
定位方式
|
XPath
|
css selector
|
标签
|
//div
|
div
|
By id
|
//div[@id='']
|
div#
|
By class
|
//div[@class='']
|
div.
|
By 属性
|
//div[@title='']
|
div[title=]
|
定位子元素
|
//div[@id='']/*
|
div#h1>*
|
还有一种写法find_element(self,by,value),用by元素定位
find_element(By.id,"xx")
find_element(By.NAME,"xx")
...
在driver.find的时候出现的代码提示,发现find_elements和find_element一样也有8种方法,其作用用于定位一组元素,通常在页面勾选复选框或直接获取一组元素再筛选出来。
#找出页面上所有tag name为input的元素
inputs = driver.find_elements_by_tag_name('input')
#从中过滤出type为CheckBox的元素
for i in inputs:
if i.get_attribute('type') == 'checkbox'
i.click()
当需要定位的元素存在于多个表单中,则需要switch_to.frame()方法切换
#切换到iframe=a的表单
driver.switch_to.frame("a")
#跳出当前一级
driver.switch_to.parent_frame()
---------------------------------------------------
2017年入行的软件测试工程师,专注于软件测试
记录学习过程中的所思所想,内容原创
如有疑问,可邮件联系,1074684960@qq.com