话不多说,直接进入主题吧
在我们的测试自动化代码中,我们通常更喜欢使用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 –
//输入[@ 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的前缀部分为常数时,这很方便。
语法:
// tag [starts-with(@attribute,'value')] 范例: //输入[starts-with(@id,'user')]我们可以使用“//”双斜杠链接多个相对的XPath声明,以找到元素位置,如下所示。
xpath = // div [@ id ='pt1:_USSpgl5'] // a [@ id ='pt1:_UIScmi4']组合“和”或“或”运算符
参照上面相同的屏幕截图,我们可以编写如下条件–
xpath = // a [@ id ='pt1:_UIScmi4'或@ class ='xnk xmi'] xpath = // a [@ id ='pt1:_UIScmi4'和@ class ='xnk xmi']祖先
我们可以使用此选项在特定Web元素的祖先的帮助下查找Web元素。
继兄弟
选择上下文节点的以下同级。
例:
// span [@ class ='xnu'] / ancestor :: div [@ id ='pt1:_USSpgl5'] / following-sibling :: div在上面的示例中,我们尝试访问“管理”下的所有菜单。
以下
开始在给定父节点之后定位元素。它在以下语句之前找到元素并将其设置为顶部节点,然后开始查找该节点之后的所有元素。
语法:
// tagName [@ attribute = value] //以下:: tagName 范例: // div [@ id ='xx'] //以下::输入 因此,基本上,搜索将从id ='xx'的div开始,并在div标签之后搜索所有具有tagname ='input'的元素。子级
选择当前节点的所有子元素。
要在以下情况下获取所有'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前
选择当前节点之前的所有节点。
语法:
// tagName [@ attribute = value] //之前:: tagName我们可以使用数组的[index]位置访问数组的ith元素。
这或多或少涵盖了用于在网页上定位元素的各种选择器和策略。希望它对您有所帮助,并增加您的知识价值。
如何在Selenium WebDriver中查找元素?(一)
python之函数基础
一篇文章教会你利用Python网络爬虫实现豆瓣电影采集
python接口测试—get请求
欢迎将文章分享到朋友圈 如需转载,请在后台回复“转载”获取授权
