谁能帮助我如何在我的xpath中使用contains?添加用户后,我的xpath一直在变化,所以我无法使用xpath来查找元素。

这是我的xpath: >添加新用户后的更改:

.//*[@id='contentText']/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[9]/td/table/tbody/tr/td[1]/strong[2]


请帮助我完成操作。

评论

分享您要查找的HTML和元素。

#1 楼

我已经测试了ExtJS应用程序。大多数页面元素属性都是动态的。它们不仅会在您添加新用户或其他内容时发生更改,而且每次您打开应用程序时都会发生更改。

我发现从工具(Firebug等)中获得的xpath表达式不是很有用。这是为什么:


难以阅读
容易破解
难以调试

我要做的是,而是花时间查看HTML并识别可能不动态的独特属性,并提供我自己的表达式。如果某个元素的属性都不是静态的,请使用页面上具有父/子/兄弟关系的静态属性的其他任何元素来定位。

我经常使用“包含”,但是还有更多。以下是一些示例:


多个条件://div[@class='bubble-title' and contains(text(), 'Cover')]

部分匹配://span[contains(text(), 'Assign Rate')]

开始于://input[starts-with(@id,'reportcombo')]

值之间有空格://div[./div/div[normalize-space(.)='More Actions...']]

同级://td[.='LoadType']/following-sibling::td[1]/select"

更复杂://td[contains(normalize-space(@class), 'actualcell sajcell-row-lines saj-special x-grid-row-collapsed')]


看看W3C “ XSL函数”页面中有更多想法。

编辑:
链接已更新。
编辑2:
XPATH已更改

评论


很好的例子!我正在使用类似的方法来自动化具有许多动态表单的JSF应用程序。我发现W3C规范非常有用。

–尼古拉·史威兹(Nicolaj Schweitz)
2015年2月10日在22:09

很高兴得知有人走了同样的路!谢谢!

– hxin
2015年2月25日,下午1:43

以前的W3C规范链接现在不起作用。请改为参考此页面。

– hxin
17年2月6日在22:26

#2 楼

为了清楚起见,您应该拆分xpath以获取单个表。

我建议以下内容:

// Get the content or container    
WebElement content = driver.findElement(By.id("contentText"));

//Get the table of users
WebElement tblUsers = content.findElement(By.xpath(".//table/tbody/tr[2]/td/table/tbody/tr/td[1]/table"));

// Get the rows which change always as and when users are added
WebElement allUsers = tblUsers.findElements(By.xpath(".//tbody/tr"));

// Loop through each row of users table
for(WebElement user : allUsers) {

   // Get the username
   WebElement username = user.findElement(By.xpath(".//td/table/tbody/tr/td[1]/strong[2]"));
   System.out.println("Username: " + username.getText());
}


评论


这实际上并没有提供有关如何使用包含的任何示例

–尼古拉·史威兹(Nicolaj Schweitz)
2015年2月10日在21:57

#3 楼

我们可以使用类似

By.xpath("//td[contains(text(),'youruser')]") //here user text is case sensitive

By.xpath("//td[contains(lower-case(text()),'youruser')]") //to handle case sensitivity. Here user is not case sensitive

#4 楼

.//*[@id='contentText']/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2]


应大大缩短XPath。如果您正在不同的浏览器中进行测试,并且页面上的任何内容发生任何更改,则可能会由于查看错误的元素而导致误报,这可能会失败。我建议您查找“相对XPaths”和“ XPath Axes”,但是如果您发布HTML和网页的屏幕截图,我可以为您演示更好的XPath。 ,您可以执行以下操作:
//table[@id ='something'@class='Something that identifies this specific table']//tr[contains(text(), 'something to identify the row')./text() = 'Exact Text Match']//strong[2]

通常,对于表行,我最终根据行中单元格的文本来识别行。或//table[@id ='something'@class='Something that identifies this specific table']//tr[.//td[contains(text(), 'something to identify the row')./text() = 'Exact Text Match']]//td//strong[2][contains(text(), 'Partial Text Match')

#5 楼

请尝试以下代码:我可以使用上述代码在任何xpath上找到任何文本。

#6 楼

XPath的2从tr[9]变为tr[10]。似乎第三个“ tr”的编号表示用户编号。

在我的实践中,删除该数字可以从HTML中提取所有用户的数据。(经RSelenium + rvest测试):

.//*[@id='contentText']/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr/td/table/tbody/tr/td[1]/strong[2] 


#7 楼

尽管已经存在许多答案,您也可以参考以下链接:

https://medium.com/edureka/xpath-in-selenium-cd659373e01a

XPath CheatSheet

#8 楼

XPATH

driver.findElement(By.xpath("/html/body/div/input[1]")).sendKeys("123");

driver.findElement(By.xpath("//input[1]")).click();

driver.findElement(By.xpath("(//input[1])[4])")).click();

driver.findElement(By.xpath("//tag[@AN='AV']")).sendKeys("123");

driver.findElement(By.xpath("//tag[text()='AV']")).sendKeys("123");

driver.findElement(By.xpath("//tag[@AN='AV' and @AN='AV']")).click();




driver.findElement(By.xpath("//tag[contains(text(),'usrn')]").getText();

driver.findElement(By.xpath("//tag[contains(@AN,'usrn')]").getText();

driver.findElement(By.xpath("//tag[starts-with(text(),'usrn')]").getText();
driver.findElement(By.xpath("//tag[starts-with(@AN,'usrn')]").getText();

ex : //input[starts-with(@id,'reportcombo')]