这是我的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]
请帮助我完成操作。
#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 楼
XPATHdriver.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')]
评论
分享您要查找的HTML和元素。