Селен неявное и явное ожидание, элемент исключения тайм-аута не найден

Я новичок в селен (но опытный разработчик 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 ответа

Давайте проанализируем, что происходит в нашем коде.

Мы определили два WebElementssearchBasket а также 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')]")));
Другие вопросы по тегам