Возможно ли найти элемент путем частичного совпадения id в Selenium

Я пытаюсь найти элементы с созданными идентификаторами, в которых известна часть идентификатора; например:

id="page_x002e_x0023_default-create-firstname"

в котором известны последние 3 слова (_default-create-firstname), но все, что предшествует этому, может быть изменено. Возможно ли это?

Ответы

Ответ 1

Вы можете применить концы с помощью селектора CSS:

By.cssSelector("[id$=default-create-firstname]")

Обновить

Прошло некоторое время, так как ответ был опубликован. Здесь некоторое обновление со страницы разработчика mozilla и комментариев ниже:

Новое использование By.css вместо By.cssSelector

By.css("[id$=default-create-firstname]")

Также рассмотрим четыре возможности

  • начиная с
  • в любом месте внутри
  • везде внутри независимо от капитализации
  • с

/* 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;
}

Ответ 2

Если вы хотите спуститься по пути xpath, вы можете использовать contains(), например:

//*[contains(@id,'_default-create-firstname')]

Это приведет к поиску всей страницы для идентификатора, содержащего текст "_default-create-firstname". Его можно легко сделать более конкретным

Ответ 3

Вы можете попробовать это в Java-Selenium: вы можете использовать либо ends-with(), либо contains(). Я думаю, что оба должны работать.

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

Ответ 4

Это работает с selenium vba

 .FindElementsByXPath( "//*[contains(@class, 'unique-string')]" )