Селен неявное и явное ожидание, элемент исключения тайм-аута не найден
Я новичок в селен (но опытный разработчик Java).
Я использую что-то вроде ниже:
WebElement searchBasket = pDriver.findElement(By.xpath("//a[contains(.,'Search&Baskets')]"));
WebElement searchproduct = pDriver.findElement(By.xpath("//a[contains(.,'Search a product')]"));
//if search an agreement is not show up, then click on other menu, then click it back
pWait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'Search&Baskets')]")));
pDriver.findElement(By.xpath("//a[contains(.,'Search&Baskets')]")).click();
// click on search an agreement
try {
pWait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'Search&Baskets')]")));
action = new Actions(pDriver);
action.moveToElement(searchBasket).build().perform();
pWait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'Search a product')]")));
searchproduct.click();
} catch (TimeoutException e) {
}
где pWait:
WebDriverWait wait = new WebDriverWait(driver, 15);
однако, когда я запускаю тестовый пример, я получаю ошибку ниже:
Unable to locate element: {"method":"xpath","selector":"//a[contains(.,'Search&Baskets')]"}
Command duration or timeout: 4 milliseconds
Я подумал, что нужно подождать как минимум 15 секунд, прежде чем выдать это исключение. Из лога выше похоже, что выкинуло исключение только в 4мс. и я мог видеть на консоли, что, как только он достиг этой линии, он выдал исключение.
Я имею неявное ожидание, установленное в 0 и использующее явное ожидание.
Я что-то здесь упускаю?
Кроме того, при явном и неявном ожидании, доходит ли оно до того, сколько времени ИЛИ точно столько же времени, например, если я устанавливаю неявное ожидание равным 10 с, то означает ли это ожидание с точностью до 10 с ИЛИ ожидание до 10 с (если элемент найден, то продолжаем, даже если элементоснов на 6-й секунде)
выше же для явного ожидания, а?
Пожалуйста помоги
2 ответа
Давайте проанализируем, что происходит в нашем коде.
Мы определили два WebElements
searchBasket
а также searchproduct
следующее:
WebElement searchBasket = pDriver.findElement(By.xpath("//a[contains(.,'Search&Baskets')]"));
WebElement searchproduct = pDriver.findElement(By.xpath("//a[contains(.,'Search a product')]"));
Мы не пытались использовать эти WebElements в нашем коде немедленно, поэтому не оказали никакого влияния.
Далее мы попробовали WebDriverWait
для WebElement
следующее:
pWait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'Search&Baskets')]")));
Опять мы не захватили return type
результата, поэтому не оказал никакого влияния.
Теперь в пределах try
блок мы снова попробовали WebDriverWait
:
pWait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'Search&Baskets')]")));
Но опять же мы не захватили / действовали на return type
результата. Вот почему двигаться вперед, когда мы сделали:
action.moveToElement(searchBasket).build().perform();
searchBasket
относится к WebElement
который мы сохранили ранее как:
WebElement searchBasket = pDriver.findElement(By.xpath("//a[contains(.,'Search&Baskets')]"));
Как это первый результат поиска (который был без WebDriverWait
), возможно, не вернул ни одного WebElement
вообще и вернули нуль.
Наконец, самый важный фактор для Unable to locate element: {"method":"xpath","selector":"//a[contains(.,'Search&Baskets')]"}
это то, что WebDriverWait
экземпляр был ждать. Вместо ожидания мы всегда старались использовать pWait
По всем этим причинам WebDriverWait
никогда не был правильно реализован в нашем коде.
Перепутать ImplicitWait
& ExplicitWait
Selenium Documentation
четко упоминается следующее:
WARNING: Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times. For example setting an implicit wait of 10 seconds and an explicit wait of 15 seconds, could cause a timeout to occur after 20 seconds.
ExpectedConditions.elementToBeClickable
Запускает isDisplayed()
а также isEnabled()
методы по СУЩЕСТВУЮЩЕМУ WebElement
,
Вы предоставляете By
в качестве параметра, который означает, что драйвер должен сначала найти ваш элемент. Это не удалось сделать это.
Убедитесь, что ваш элемент присутствует с помощью wait
до тех пор presenceOfElementLocatedBy(By by)
,
Пример:
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocatedBy(By.xpath("//a[contains(.,'Search&Baskets')]")));
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(.,'Search&Baskets')]")));