背景
ui自动化中,无论是B/S自动化,还是C/S自动化,,定位和识别元素都是自动化设计的基石。若不能准确定位识别目标对象,自动化将无法进行。在此总结下目前已知的web自动化框架selenium中定位元素方法。若有遗漏,还请不吝赐教。
Selenium WebDriver中提供的定位元素方法
1. 常见的8种定位方法:
#id定位
find_element_by_id( id )
#name定位
find_element_by_name( name )
#tag定位
find_element_by_tag_name( tag_name )
#class定位
find_element_by_class_name( class_name )
#link_text定位
find_element_by_link_text( link_text )
#partial link 定位
find_element_by_partial_link_text( partial_link_text )
#XPath定位
find_element_by_xpath( XPath )
#CSS_selector定位
find_element_by_css_selector( css_selector )
这8种方法,是定位的基础方法,个人觉得也是最重要方法。毕竟基础很重要。虽然还有其他变种的定位方法,但那些方法本质上都可以使用这8种方法代替。
在测试设计中,根据不同的环境,这8种方法都有使用的必要。不过XPath定位和CSS_selector定位方式使用频率相对较高。
2. 用By定位元素
针对上面8种方法,WebDriver还提供了另外一种写法。即统一调用find_element()方法,通过参数By来实现定位方式的区别。如下:
find_element(BY.ID, id)
find_element(BY.NAME, name)
find_element(BY.CLASS_NAME, class_name)
find_element(BY.TAG_NAME, tag_name)
find_element(BY.LINK_TEXT, link_text)
find_element(BY.PARTIAL_LINK_TEXT, partial_link_text)
find_element(BY.XPATH, xpath)
find_element(BY.CSS_SELECTOR, css_selector)
通过查看D:\Python3.7\Lib\site-packages\selenium\webdriver\remote\webdriver.py中的底层代码,发现他们其实是一样的,例如,find_element_by_id()其实是在find_element(BY.ID, id)上封装了一层。
def find_elements_by_id(self, id_):
"""
Finds multiple elements by id.
:Args:
- id\_ - The id of the elements to be found.
:Returns:
- list of WebElement - a list with elements if any was found. An
empty list if not
:Usage:
elements = driver.find_elements_by_id('foo')
"""
return self.find_elements(by=By.ID, value=id_)
3. 定位一组元素
定位一组元素的方法名称与定位单个元素方法名称的区别在于,是单词“element”后面多一个“s”,代表复数。
#id定位
find_elements_by_id( id )
#name定位
find_elements_by_name( name )
#tag定位
find_elements_by_tag_name( tag_name )
#class定位
find_elements_by_class_name( class_name )
#link_text定位
find_elements_by_link_text( link_text )
#partial link 定位
find_elements_by_partial_link_text( partial_link_text )
#XPath定位
find_elements_by_xpath( XPath )
#CSS_selector定位
find_elements_by_css_selector( css_selector )
###By定位###
find_elements(BY.ID, id)
find_elements(BY.NAME, name)
find_elements(BY.CLASS_NAME, class_name)
find_elements(BY.TAG_NAME, tag_name)
find_elements(BY.LINK_TEXT, link_text)
find_elements(BY.PARTIAL_LINK_TEXT, partial_link_text)
find_elements(BY.XPATH, xpath)
find_elements(BY.CSS_SELECTOR, css_selector)
定位一组元素方法返回的是具有相同类型属性的一组对象的列表。可以使用处理列表的方法来获取指定的对象。
4. JS定位的5种方法
该方法一般用于webdriver定位失效时,或者需要通过JS脚本获取对象执行一些指令,通过WebDriver提供的execute_script()方法执行JS脚本来定位对象。
document.getELementById( id )
document.getElementsByName( name )
document.getElementsByTagName( tagname )
document.getElementsByClassName( classname )
document.querySelectorAll( css_selector )
以上5种方式中,除了document.getELementById()方法返回单个对象,其他4种方法返回的具有同一属性的一组对象的列表。
通过简单的示例演示如何使用JS定位:
#JS脚本以 ; 号结尾
#click()方法为点击该对象
JS_ById = "document.getELementById( id ).click();"
#value='xxx'代表向对象输入值‘XXX’
JS_ByName = "document.getElementsByName( name )[0].value = 'XXX'; "
driver.execute_script(JS_ById)
driver.execute_script(JS_ByName)
总结
- 以上为笔者目前所知的定位方式,若有遗漏,欢迎提醒。
- 在所有定位方式中,xpath定位功能性相对好,但是由于其使用时需要扫描页面上所有元素的关系,导致其定位耗时较长,其性能相对差。然后由于有的页面是动态结构,或者更新程序导致页面元素结构发生变化,此时原来可以工作的xpath定位方法将报错,导致其稳定性较差,尤其是使用绝对路径定位时。总而言之,Xpath定位方式功能性好,性能、稳定性不够好。这些都只是它的特点,我们需要见人见智,根据项目的实际情况来决定使用哪一种定位方式。