前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Selenium WebDriver中查找元素?(二)

如何在Selenium WebDriver中查找元素?(二)

作者头像
用户7466307
发布2020-06-24 16:20:39
2.8K0
发布2020-06-24 16:20:39
举报
话不多说,直接进入主题吧

通过XPATH选择器查找

在我们的测试自动化代码中,我们通常更喜欢使用id,名称,类等这些定位符。但是,有时我们在DOM中找不到它们中的任何一个,而且有时某些元素的定位符在DOM中会动态变化。在这种情况下,我们需要使用智能定位器。这些定位器必须能够定位复杂且动态变化的Web元素。

最近,我在努力寻找定位Web元素的方法。在各种环境中使用相同版本的SaaS实例会生成不同的Ids.XPATH选择器助我一臂之力,我主要使用contains()选项来定位Web元素。

编写XPATH选择器还有其他策略。下面简要说明这些内容

绝对和相对XPath

绝对

相对的

定位元素的直接方法

从DOM元素的中间开始

如果访问元素的路径因位置而改变,则脆性可能会破裂

由于搜索相对于DOM相对稳定

以“ /”开头并从根开始

以“ //”开头,它可以在DOM中的任何位置开始搜索

较长的XPATH表达式

较短的表达

代码语言:javascript
复制
//tag[@attribute='value']
 
public class LocateByXPATHSel
{
 
    public static void main (String [] args)
{ 
     
             WebDriver driver = new FirefoxDriver();
             driver.get(<url>);// 输入url地址
 
WebElement el = driver.findElement(By.xpath("xpath=//button[@id='pt1:r1:0:r0:1:AP1:APb']")); // trying to   
                                                       locate a buttton
 
el.click();
 
   }
 
}

使用contains()

这是非常方便的XPath Selenium定位器,有时可以节省测试自动化工程师的生命。当元素的属性是动态的时,我们可以将contains()用作web元素的恒定部分,但也可以在需要时在任何情况下使用contains()

融合实例#1

融合实例#2

如果我们比较同一字段,则它具有2个动态生成的ID –

代码语言:javascript
复制
//输入[@ id ='pt1:_FOr1:1:_FONSr2:0:MAnt2:1:pt1:pt_r1:0:pt1:SP1:NewPe1:0:pt_r1:0:r1:0:i1:0:it20::内容']
或者
// input [@id ='_ FOpt1:_FOr1:0:_FOSritemNode_workforce_management_new_person:0:MAnt2:1:pt1:pt_r1:0:pt1:SP1:NewPe1:0:pt_r1:0:r1:0:i1:0:it20::内容']
在这种情况下,我们需要标识动态Web元素的常量部分,即“ Mant2:1:pt1:pt_r1:0:pt1:SP1:NewPe1:0:pt_r1:0:r1:0:i1:0:it20::content”,然后创建XPATH语法,如下所示:

xpath = // input [包含(@id,'Mant2:1:pt1:pt_r1:0:pt1:SP1:NewPe1:0:pt_r1:0:r1:0:i1:0:it20 :: content')]所以在两个实例上都可以使用相同Selenium的记录。
公共类LocateByXPATHSel {

公共静态void主(字符串[] args){

WebDriver驱动程序=新的FirefoxDriver(); // Chrome的实例| Firefox | IE驱动

driver.get(<URL>); //打开应用程序

WebElement el = driver.findElement(By.xpath(“ xpath = // input [包含(@id,'Mant2:1:pt1:pt_r1:0:pt1:SP1:NewPe1:0:pt_r1:0:r1:0:i1:0:it20 :: content')]“));

el.sendKeys(“ Johnson”);

}
}

[/ java]

以。。开始

此方法检查属性的起始文本。当属性值动态更改时使用非常方便,但是您也可以将此方法用于不变的属性值。当动态Web元素的ID的前缀部分为常数时,这很方便。

语法:

代码语言:javascript
复制
// tag [starts-with(@attribute,'value')]
范例:
//输入[starts-with(@id,'user')]

我们可以使用“//”双斜杠链接多个相对的XPath声明,以找到元素位置,如下所示。

代码语言:javascript
复制
xpath = // div [@ id ='pt1:_USSpgl5'] // a [@ id ='pt1:_UIScmi4']

组合“和”或“或”运算符

参照上面相同的屏幕截图,我们可以编写如下条件–

代码语言:javascript
复制
xpath = // a [@ id ='pt1:_UIScmi4'或@ class ='xnk xmi']

xpath = // a [@ id ='pt1:_UIScmi4'和@ class ='xnk xmi']

祖先

我们可以使用此选项在特定Web元素的祖先的帮助下查找Web元素。

继兄弟

选择上下文节点的以下同级。

例:

代码语言:javascript
复制
// span [@ class ='xnu'] / ancestor :: div [@ id ='pt1:_USSpgl5'] / following-sibling :: div

在上面的示例中,我们尝试访问“管理”下的所有菜单。

以下

开始在给定父节点之后定位元素。它在以下语句之前找到元素并将其设置为顶部节点,然后开始查找该节点之后的所有元素。

语法:

代码语言:javascript
复制
// tagName [@ attribute = value] //以下:: tagName
范例:

// div [@ id ='xx'] //以下::输入
因此,基本上,搜索将从id ='xx'的div开始,并在div标签之后搜索所有具有tagname ='input'的元素。

子级

选择当前节点的所有子元素。

代码语言:javascript
复制
要在以下情况下获取所有'li'元素,我们将语法编写为
–//ul[@id ='_ FOpt1:_FOr1:0:_FOSritemNode_workforce_management_new_person:0:MAnt2:1:pt1:pt_r1:1:pt1:SP1:Perso2:0:pt_r3:0:soc3 :: pop'] / child:li

选择当前节点之前的所有节点。

语法

代码语言:javascript
复制
// tagName [@ attribute = value] //之前:: tagName

在Selenium WebDriver中查找元素:在元素数组中查找元素

代码语言:javascript
复制
//div[@id ='pt1:r1:0:rt:1r2:0:dynamicRegion1:0:AP1:findByContentItemQueryResultId:_ATp:ciTblR1::db']/table/ tbody / tr / td / div / table / tbody / tr / td [1]

我们可以使用数组的[index]位置访问数组的ith元素。

这或多或少涵盖了用于在网页上定位元素的各种选择器和策略。希望它对您有所帮助,并增加您的知识价值。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试test 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 通过XPATH选择器查找
  • 在Selenium WebDriver中查找元素:在元素数组中查找元素
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档