Селен: оба ждут и получают элемент, когда готовы - PullRequest
1 голос
/ 03 августа 2020

Вместо выполнения двух шагов:

wait.until(webDriver -> webDriver.findElement(By.id("userTable")));

и последующего извлечения элемента, когда он будет готов:

WebElement x = webDriver.findElement(By.id("userTable"));

можно ли это сделать за один шаг?

Например, я не хочу делать:

wait.until(webDriver -> webDriver.findElement(By.id("userTable")).findElement(By.xpath(".//*[@id=\"userTable\"]/tbody/tr/td[1]/a"))).click();

, но хотел бы разбить его на шаги, потому что это понятнее:

Это сначала подождите, пока он будет готов:

wait.until(webDriver -> webDriver.findElement(By.id("userTable")));

, затем получите ссылку на него:

WebElement x = webDriver.findElement(By.id("userTable"));

, а затем получите дочерний элемент:

x.findElement(By.xpath(".//*[@id=\"userTable\"]/tbody/tr/td[1]/a"))).click();

Так может wait и получение ссылки части как-то соединить за один шаг?

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

until метод возвращает <T>, который является общим c и основан на типе возвращаемого значения, которое вы указываете в лямбда-выражении. Поскольку findElement возвращает WebElement, тип возврата метода until также будет WebElement.

С предоставленной реализацией вы уже решили свою проблему, поскольку until вернет WebElement или выбросит TimeoutException

Просто сохраните ссылку на переменную:

WebElement userTable = wait.until(webDriver -> webDriver.findElement(By.id("userTable")));
0 голосов
/ 03 августа 2020

Поскольку ваш вариант использования - вызвать click(), вы можете вызвать WebDriverWait в сочетании с ExpectedConditions для elementToBeClickable(), и вы можете использовать любую из следующих стратегий локатора :

  • cssSelector:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("#userTable>tbody>tr td:nth-child(2)>a"))).click();
    
  • xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id='userTable']/tbody/tr/td[1]/a"))).click();
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...