Нажав на текст между тегами SPAN, используя Selenium Webdriver (java)

HTML-код выглядит следующим образом:

<td id="id26a" class="doclisting-name link" style="width: 319px; min-width: 319px;"> 

<span id="id26b" title="Document">
<span class="ie-fallback-marker">
  words

</span></span></td>

Я не могу найти Element ID, поскольку он постоянно меняется. Я не могу найти класс элемента, так как есть множественные числа, которые могут меняться.

Я хочу, чтобы можно было нажать "СЛОВА" между тегами SPAN. Возможно ли это?

Это то, что я использовал до сих пор, но ни один из них не работает:

//string document is words.
   public void testscenario123(String document)      throws Throwable {
    Thread.sleep(3000);
    driver.findElement(By.linkText(document)).click();
}

или

  //string document is words.
 public void testscenario124(String document) throws Throwable {
    Thread.sleep(3000);
    driver.findElement(By.xpath("//*[contains(@span,'"+document+"')]")).click();
}

Ответ 1

Вы можете выбрать xpath через текст, а нормализовать-пробел разделит пробел:

  //string document is words.
 public void testscenario124(String document) throws Throwable {
    Thread.sleep(3000);
    driver.findElement(By.xpath("//*[normalize-space()='"+document+"']")).click();
}

Вы также можете рассмотреть возможность ожидания появления элемента вместо объявления явного сна

Ответ 2

Я подозреваю, что элемент занимает больше 3 секунд, чтобы появиться. Сброс следующего исключения:

Элемент в настоящее время не виден и поэтому не может взаимодействовать с

Чтобы избежать этого исключения, следует использовать неявное или явное ожидание.

new WebDriverWait(driver,10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[contains(., \"" + document + "\")]"))).click();

Как упоминал РоббиWareham, мне даже интересно узнать об этом waiting makes a ridiculous piece of code?

Через Selenium Webdriver мы просто пытаемся подражать тому, как пользователь будет работать. Даже он должен ждать появления элемента для выполнения некоторой операции.

Ответ 3

Попробуйте использовать это:

driver.findElement(By.xPath("//span[starts-with(., \"" + document + "\")]")).click();

Это сработало для меня! Если вы хотите проверить текст в середине, попробуйте:

driver.findElement(By.xPath("//span[contains(., \"" + document + "\")]")).click();

Ответ 4

Я не вижу причин, по которым следующий xpath не будет работать

driver.findElement(By.xpath("//span[contains(text(), \"" + document + "\")]"));

Кроме того, вам, вероятно, потребуется, чтобы ваша строка ввода была постоянной

//string document is words.
   public void testscenario123(final String document)      throws Throwable {

Если вы должны были получить ElementNotVisibleException, то проверьте, возвращает ли ваш локатор правильный элемент, возможно, есть другой элемент <span>, содержащий текст в переменной document.

Ответ 5

Мы можем использовать xPath для поиска такого элемента, потому что текст находится внутри тега span. Ниже приведен фрагмент кода...

WebElement elmnt=driver.findElement(By.xpath(".//*[@id='MainLayout']/div/div[2]/div/div/div[3]/div/div[2]/div/div/div/div/div[2]/div/div/div[2]/div/div[2]/div/div/div[3]/div/div[2]/div/div/div[1]/div/div/div/div/div/div[4]/span/span"));

elmnt.click();