3

我正在使用 Selenium 使事情自动化。需要您的帮助来处理动态 Xpath,如下所示:

Driver.findElement(By.xpath("//[@id='INQ_2985']/div[2]/tr/td/div/div[3]/div")).click();

如上在每次运行期间INQ_2985更改为2986,29872988

HTML 代码:

< div> class="context-menu-item-inner" style="background-image:url(../images/productSmall.png);">Tender Assignment < /div> 

尝试了以下不同的组合,但没有成功:

// Driver.findElement(By.name("//input[@name='Tender Assignment']")).click();
//  Driver.findElement(By.className("context-menu-item-inner")).click();` 

你能帮我解决这个问题吗?

4

6 回答 6

1

你可以尝试使用contains()starts-with()在xpath中,

上面的xpath可以改写如下,

Driver.findElement(By.xpath("//*[starts-with(@id,'INQ')]/div[2]/tr/td/div/div[3]/div")).click() ;

如果您可以发布更多的 html,我们可以帮助改进您的 xpath..

  • 此外,不建议使用如此长的 xpath,这可能会导致您的测试更频繁地失败

例如,如果在 UI 中添加了“新表数据或 div”,则上面的 xpath 将不再有效

  • 您应该尝试使用 id、class 或其他属性来更接近您要查找的元素
  • 我个人建议使用cssSelectorsoverxpath
于 2013-11-12T07:40:09.097 回答
1

你可以使用 css -

div.context-menu-item-inner

使用这个 xpath:

driver.findElement(By.cssSelector("div.context-menu-item-inner").click();
于 2016-06-22T11:30:42.023 回答
1

你可以使用很多方法,使用隐式等待;

driver.findElement(By.xpath("//*[contains(@id,'select2-result-label-535')]").click();

driver.findElement(By.xpath("//*[contains(text(), 'select2-result-label-535')]").click();
于 2015-12-17T14:17:26.400 回答
1

好用的正则表达式

driver.findElement(By.xpath("//*[contains(@id,'INQ_')]")

注意:如果您有名称从 INQ_ 开始的单个 ID,那么您可以对元素执行操作。如果是一堆ID,则可以提取为a List<WebElements>,然后与元素的特定文本匹配(element.getText().trim() =="Linked Text"如果匹配则采取行动。您可以按照其他逻辑进行遍历匹配。

于 2015-12-17T20:58:03.123 回答
0

如果您的 xpath 不同

例如:"//*[@id='msg500']" , "//*[@id='msg501']", "//*[@id='msg502']"等等……

然后在脚本中使用此代码:

for (int i=0;i<=9;i++) {
String mpath= "//*[@id='msg50"+i+"']";
driver.findElement(By.xpath(mpath)).click();
}
于 2014-07-28T09:48:07.710 回答
0

最好的选择是使用完整的 xpath 而不是 id,您可以通过 firebug 轻松获得。

例如

/html/body/div[3]/div[3]/div[2]/div/div[2]/div[1]/div/div[1]
于 2015-03-30T18:11:41.693 回答