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()
 
posted @ 2018-07-20 17:02  祝新新zxy  阅读(150)  评论(0编辑  收藏  举报