是否可以通过Selenium中的部分id匹配来定位元素

Dar*_*ar1 36 selenium selenium-webdriver

我正在尝试使用生成的ID定位元素,其中ID的某些部分是已知的; 例如:

id="page_x002e_x0023_default-create-firstname"
Run Code Online (Sandbox Code Playgroud)

其中最后3个单词(_default-create-firstname)已知但前面的任何内容都可能发生变化.这可能吗?

ale*_*cxe 51

您可以使用 CSS选择器应用结束:

By.cssSelector("[id$=default-create-firstname]")
Run Code Online (Sandbox Code Playgroud)

更新

自答案公布以来,有一段时间过去了.这里有一些来自链接的mozilla开发者页面和评论的更新:

新用By.css而不是By.cssSelector

By.css("[id$=default-create-firstname]")
Run Code Online (Sandbox Code Playgroud)

另见四种可能性

  • 以...开始
  • 里面任何地方
  • 内部任何地方,无论大写
  • 结束

/* Internal links, beginning with "#" */
a[href^="#"] {
  background-color: gold;
}

/* Links with "example" anywhere in the URL */
a[href*="example"] {
  background-color: silver;
}

/* Links with "insensitive" anywhere in the URL,
   regardless of capitalization */
a[href*="insensitive" i] {
  color: cyan;
}

/* Links that end in ".org" */
a[href$=".org"] {
  color: red;
}
Run Code Online (Sandbox Code Playgroud)

  • 并且可以匹配id的开头:By.CssSelector("id ^ = default-create-firstname") (8认同)
  • 并匹配包含"partialId"的id的元素:By.cssSelector("[id*= partialId]") (2认同)

Cat*_*hal 22

如果你想沿着xpath路线走,那么你可以使用contains(),如下所示:

//*[contains(@id,'_default-create-firstname')]
Run Code Online (Sandbox Code Playgroud)

这将在整个页面中搜索包含文本"_default-create-firstname"的id.它可以很容易地变得更具体


小智 18

你可以在Java-Selenium中尝试这个:你可以使用ends-with()或者contains().我认为两者都应该奏效.

driver.findElement(By.xpath("//*[ends-with(@id,'_default-create-firstname')]"));
driver.findElement(By.xpath("//*[contains(@id, '_default-create-firstname')]"));
Run Code Online (Sandbox Code Playgroud)


Jor*_*rge 6

这适用于selenium v​​ba

 .FindElementsByXPath( "//*[contains(@class, 'unique-string')]" )
Run Code Online (Sandbox Code Playgroud)