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

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

то же самое и для явного ожидания?

Пожалуйста помоги


person Manglesh    schedule 06.12.2017    source источник
comment
Привет, я попытался сделать то же самое с неявным ожиданием как 0 и с явным временем ожидания как 10. Время ожидания истекло ровно на 10-й секунде. Также недопустимо смешивать как неявное ожидание, так и явное ожидание. Но это не должно быть проблемой, поскольку ваш неявный тайм-аут равен 0 секундам. В случае, если элемент будет найден на 6-й секунде, он перейдет к следующему шагу. Он не будет ждать все 10 секунд как для неявного, так и для явного ожидания. Вы можете вставить сюда весь код?   -  person shank087    schedule 06.12.2017
comment
Спасибо ... обновил код ...   -  person Manglesh    schedule 06.12.2017


Ответы (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 и вернуть Null.

Наконец, самый важный фактор ошибки Невозможно найти элемент: {"method": "xpath", "selector": "// a [contains (., 'Search & Baskets')]"} есть, экземпляр WebDriverWait был wait. Вместо использования wait мы всегда пытались использовать pWait

Таким образом, по всем этим причинам WebDriverWait никогда не был должным образом реализован в нашем коде.


Смешивание ImplicitWait и ExplicitWait

В документации Selenium четко упоминается следующее:

ПРЕДУПРЕЖДЕНИЕ: не смешивайте неявное и явное ожидание. Это может привести к непредсказуемому времени ожидания. Например, установка неявного ожидания в 10 секунд и явного ожидания в 15 секунд может вызвать тайм-аут через 20 секунд.

person DebanjanB    schedule 06.12.2017

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')]")));
person Fenio    schedule 06.12.2017