Python3+selenium总结之定位概述

背景

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)

总结

  1. 以上为笔者目前所知的定位方式,若有遗漏,欢迎提醒。
  2. 在所有定位方式中,xpath定位功能性相对好,但是由于其使用时需要扫描页面上所有元素的关系,导致其定位耗时较长,其性能相对差。然后由于有的页面是动态结构,或者更新程序导致页面元素结构发生变化,此时原来可以工作的xpath定位方法将报错,导致其稳定性较差,尤其是使用绝对路径定位时。总而言之,Xpath定位方式功能性好,性能、稳定性不够好。这些都只是它的特点,我们需要见人见智,根据项目的实际情况来决定使用哪一种定位方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值