Могу ли я искать элемент через By.name только с частичным именем? - PullRequest
0 голосов
/ 04 июля 2018

Я использовал

WebElement strecord = driver.findElement(By.name("Ui_u123));

Значение может быть найдено только с помощью "By.name"

Поле теперь динамическое, но первые 3 символа всегда "Ui_u"

Как я могу найти его сейчас, "By.name" содержит ....?

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Почему бы вам не попробовать способ CSS [name*='Ui_u']?

Обратите внимание, что *= означает, что содержит, и вы можете использовать [] для любого тега элемента.

С уважением,

0 голосов
/ 05 июля 2018

Отвечая прямо, Нет , вы не можете использовать contains в сочетании с By.name.

Explaination

Согласно Стратегиям локатора при использовании driver.findElement(By.name("Ui_u123)); внутреннего Java-клиента реализация:

case "name":
  toReturn.put("using", "css selector");
  toReturn.put("value", "*[name='" + value + "']");
  break;

преобразует стратегию локатора:

driver.findElement(By.name("Ui_u123));

до:

driver.findElement(By.cssSelector("[name='Ui_u123']));

Подробное обсуждение можно найти в Официальные стратегии поиска для веб-драйвера


Теперь, если вы попытаетесь принудительно использовать ключевое слово contains, оно увеличит InvalidSelectorException следующим образом:

org.openqa.selenium.InvalidSelectorException: invalid selector: Unable to locate an element with the xpath expression

Если вы хотите реализовать подход, аналогичный contains, вы можете использовать любое из следующих решений:

  • ^: для указания значения атрибута начинается с

    WebElement strecord = driver.findElement(By.cssSelector("[name^='Ui_u']));
    
  • $: для указания значения атрибута заканчивается (неприменимо в вашем случае, так как атрибут начинается с Ui_u)

    WebElement strecord = driver.findElement(By.cssSelector("[name$='123']));
    
  • *: для указания значения атрибута содержит

    WebElement strecord = driver.findElement(By.cssSelector("[name*='Ui_u']));
    

Подробное обсуждение можно найти в Как получить селекторы с динамической частью внутри, используя Selenium с Python?

0 голосов
/ 04 июля 2018

Вы можете попробовать этот xpath:

//*[starts-with(@name,'Ui_u')]  

Хотя это xpath . Я не уверен насчет starts-with с атрибутом Name .

Может совпадать с более чем одним элементом. В этом случае вам придется использовать findElements()

Код :

List<WebElement> strecord = driver.findElements(By.xpath("//*[starts-with(@name,'Ui_u')]"));  

Как дополнение к ответам @HellPine. Вы можете написать селектор CSS как:

tagName[name^='Ui_u']
...