ui自动化页面元素定位语句编写和验证

Ui自动化的基础是页面元素定位。

     在python Selenium语句中定位方式主要有By.Id()、By.Name()、By.Xpath()、By.tagName()、By.className()、By.CssSelector()、By.linkText()、By.partialLinkText()这8类。由于现在的页面元素不一定有Id、Name、tagName和className的属性,所以最常用的是By.Xpath()、By.CssSelector(),如果是定位页面上的超文本链接,用By.linkText()。

    Xpath定位方法简单直接且唯一,功能全面。但是页面层级一旦变化,需要调整代码,可维护性不好。

    css定位方法代码简洁,性能好,但是语法复杂,某些浏览器不支持CSS定位方式。

    谷歌、火狐浏览器的console控制台自带验证Xpath和css的工具,可以帮助我们定位和验证页面元素。

Xpath定位语法

  以百度输入框的绝对路径“/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input “为例讲解。

表达语句

描述

举例

解释

nodename

选取此节点的所有同级节点

/html/body/div

div节点下所有子节点

/

根节点选取

 

用于绝对路径选择

//

不考虑位置

//body/div

匹配到符合条件即可

.

当前节点

/html/body/div/.

与上面/html/body/div效果一致

..

当前节点的父节点

/html/body/div/..

匹配到body

@

选取属性

//input[@id='kw']

’@‘后面输入属性条件

[n]

选取元素下第N个子元素

/html/body/div[2]

body下第2个div子元素

[last()]

选取元素下倒数第一个子元素

/html/body/div[last()]

body下倒数第一个div子元素

*

匹配任何节点

/html/body/*

body下所有子节点

preceding-sibling::nodename[N]

匹配前N位的类型为nodename的同级节点

//form/preceding-sibling::div[1]

与from同级的前面一位的兄弟div节点

following-sibling::nodename[N]

匹配后N位的类型为nodename的同级节点

//form/following-sibling::div[1]

与from同级的后面一位的兄弟div节点

child::nodename[N]

匹配上级节点的子节点类型为nodename的第N个节点

//form/span[1]/child::input[1]

Form下第一个span节点的第一个input子节点

parent::nodename[N]

匹配上级节点的nodename类型的第N个节点

//form/parent::span[1]

Form元素的父级节点中第一个span元素

  xpath中支持运算符计算,但是很少用到。

运算符

描述

实例

返回值

|

计算两个节点集

//book | //cd

返回所有拥有 book 和 cd 元素的节点集

+

加法

6 + 4

10

-

减法

6月4日

2

*

乘法

6 * 4

24

div

除法

8 div 4

2

=

等于

price=9.80

满足条件为ture,不满足为false

!=

不等于

price!=9.80

满足条件为ture,不满足为false

小于

price<9.80

满足条件为ture,不满足为false

<=

小于或等于

price<=9.80

满足条件为ture,不满足为false

大于

price>9.80

满足条件为ture,不满足为false

>=

大于或等于

price>=9.80

满足条件为ture,不满足为false

or

/html//input[@name='wd'or @class='s_ipt']

满足条件为ture,不满足为false

and

/html//input[@name='wd'and @class='s_ipt']

满足条件为ture,不满足为false

mod

计算除法的余数

5 mod 2

1

 xpath方法元素定位注意点:

    1、属性内容在python代码中可以用双引号包裹,也可以用单引号包裹,但是在浏览器中验证的时候只能用单引号包裹。建议在代码中也使用单引号包裹,语句外层用双引号包裹,如下,text()='首页'中文字字段用单引号包裹,完整定位语句用双引号包裹。

WebDriverWait(browser, 15, 0.5).until(EC.presence_of_all_elements_located((By.XPATH, "//ul/div[1]/a/li/span[text()='首页']")))

      在浏览器console中验证为“ $x("//input[@id='kw']") ”。注意全英文。

   2、非属性内容,不需要加“@”,例如代码

    定位语句为:“/html/body//span[2][text()='按图片搜索']”。因为”按图片搜索“不是span元素的属性。

    3、尽量避免使用绝对路径来定位,而是使用属性id、name、class、type等定位。如果子集节点没有唯一属性,可以找父级节点、祖父节点等。例如:百度页面输入框绝对路径为:“/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input”,可以替换为“//form[@id='form']/span[1]/input”。这样减轻了代码量,同时减少元素层级变化带来的代码维护量。

    4、xpath还提供contains()方法,实现模糊定位。contains()需要输入2个属性,一个是元素名称,一个是元素内容,中间以逗号隔开。例如:“//form[@id='form']/span[1]/input”可以替换为“//*[contains(@id,'form')]/span[1]/input”;再例如“/html/body//span[2][text()='按图片搜索']”可以修改为“/html/body//span[contains(text(),'按图片搜索')]”。

    5、child::与parent::如果加上*,则表示查找所有子节点或者父节点。

    6、查找子节点中“//form/span[1]/child::input[1]”与“//form/span[1]/input[1]”效果一致。

    7、查找父节点中,“//form/parent::*/parent::*”与“//form/../..”效果一致。

css定位语法

基本语法如下:css语法与与Xpath有诸多类似的地方。

表达语句

描述

举例

解释

nodename

元素选择,同时选择多个元素可用逗号分隔

input

选择所有input元素

#

id选择器符号

#head

选择所有id=head的元素

>或者空格

上下级元素分隔符为>或者空格

html>body>div>div>div>div>div>form>span>input

用于绝对路径选择

.

class选择器

form.fm>span>input.s_ipt

选择所有class=s_ipt的元素

*

所有元素

form.fm>span>*

符合span查找的当前等级下所有的下级节点

[表达式]

元素内容筛选。以字符^指明从字符串的开始匹配,以字符以字符*指明在需要进行模糊查询,以字符$指明在字符串的结尾匹配

input[name='wd']
form.fm>span>input[value^='百度']
form.fm>span>input[value*='度']
form.fm>span>input[value$='一下']

查找name='wd'的input元素
字符首匹配
字符模糊匹配
字符尾匹配

:first-child

第一个子节点

div#u1 a:first-child

id为u1的div元素的第1个子a元素

:nth-child(N)

第N个子节点

div#u1 a:nth-child(3)

id为u1的div元素的第3个子a元素

:last-child

最后一个子节点

div#u1 a:last-child

id为u1的div元素的最后一个子a元素

css方法定位元素注意点:

    1、css的绝对路径不能省略。

    2、css定位没有有能够获取父节点的办法,也不能获取当前元素的所有子节点。

页面元素定位语句编写和调试

    火狐浏览器和谷歌浏览器都很好的支持元素的查找、定位、调试。以谷歌浏览器为例:

    1、F12打开开发者工具,进入到Elements查看器,查看页面元素。

 

    2、选择被定位元素。

      点击Elements查看器上方定位按钮。

 

 

     选择后鼠标停留在需要定位的元素内容上,元素的代码部分就会突出显示。

 

    例如我们定位到百度页面的输入框内容如下:

 

 

 3、编辑定位语句。

     如果使用xpath语句定位元素,选中语句,右键--copy--copy Full Xpath  点击。xpath层级就被复制到剪贴板,如下:“/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input”经过语法处理,可以为“//form[@id='form']/span[1]/input”。

     如果使用css语句定位,根据语句id=‘kw‘,编辑定位语句为"#kw"。

4、定位语句调试。

    定位语句编辑好之后往往需要验证是否正确,是否唯一。

    切换到Console控制台验证定位语句。

 

    验证定位语句需要用Console中的属性,如下:

  •  $():简单理解就是 document.querySelector,可用于验证css定位语句,但是只能在回车后才能看到匹配结果,不建议使用。
  • $$():简单理解就是 document.querySelectorAll ,可用于验证css定位语句。编辑时可显示匹配结果,建议使用。

 

 

  • $x():Xpath选择器,可用于验证xpath定位语句。注意x必须小写。编辑时可显示匹配结果,很方便,建议使用。
  • $_ // 是上一个表达式的值,等同于键盘的“向上”快捷键。连续使用上一个值时,建议用键盘快捷键。

     定位语句需要以双引号包裹。以xpath方式验证如下:定位到唯一的正确元素后,就可以在python代码中使用定位语句了。

 

 5、使用定位语句

获取的定位语句在python中可以直接使用。如下:

browser.find_element_by_xpath(“ //form[@id='form']/span[1]/input “).send_keys('UI自动化')

 

posted @ 2021-06-19 16:34  CQUqinghua  阅读(781)  评论(0编辑  收藏  举报