通过XPATH选择器查找
在我们的测试自动化代码中,我们通常更喜欢使用id,名称,类等这些定位符。但是,有时我们在DOM中找不到它们中的任何一个,而且有时某些元素的定位符在DOM中会动态变化。在这种情况下,我们需要使用智能定位器。这些定位器必须能够定位复杂且动态变化的Web元素。
最近,我在努力寻找定位Web元素的方法。在各种环境中使用相同版本的SaaS实例会生成不同的Ids.XPATH选择器助我一臂之力,我主要使用contains()选项来定位Web元素。
编写XPATH选择器还有其他策略。下面简要说明这些内容
绝对和相对XPath
绝对 | 相对的 |
---|---|
定位元素的直接方法 | 从DOM元素的中间开始 |
如果访问元素的路径因位置而改变,则脆性可能会破裂 | 由于搜索相对于DOM相对稳定 |
以“ /”开头并从根开始 | 以“ //”开头,它可以在DOM中的任何位置开始搜索 |
较长的XPATH表达式 | 较短的表达 |
//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元素。
这或多或少涵盖了用于在网页上定位元素的各种选择器和策略。希望它对您有所帮助,并增加您的知识价值。