Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Webdriver implicitWait не работает должным образом

Автор вопроса: user2254173Ответов: 2

В коде веб-драйвера, если я использую thread.sleep(20000). Он ждет 20 секунд, и мой код тоже работает нормально. Чтобы заархивировать то же самое, если я использую неявное ожидание, например

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

Он не ждет принудительно 20 секунд и переходит к следующим шагам всего за 3-4 секунды. и страница все еще загружается.

Это проводная ситуация, так как я использую свободное ожидание, чтобы найти некоторые элементы. если элементы все еще загружаются на страницу, это не показывает ошибку и делает тест пройденным.

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
  .withTimeout(50, TimeUnit.SECONDS)
  .pollingEvery(5, TimeUnit.SECONDS)
  .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
  public WebElement apply(WebDriver driver) {
    return driver.findElement(By.id("jxxx"));
  }
});

Но если я скажу неправильный идентификатор, он будет ждать 50 секунд, но другой тест будет пройден без щелчка ... он не показывает никакой ошибки.

Мой вопрос заключается в том, как мне следует избегать Thread.sleep(), поскольку другие методы селена мне не помогают.

  • спасибо, что заглянули в этот @JimEvans, я отредактировал свой код и теперь использую только свободное ожидание, но это не дает никаких ошибок и ничего не делает. user2254173 15.04.2013

seleniumselenium-webdriver

Ответы

Ответ 1 · рейтинг 3 · user2087450

Используйте метод ниже, чтобы дождаться элемента:

public boolean waitForElementToBePresent(By by, int waitInMilliSeconds) throws Exception
{

    int wait = waitInMilliSeconds;
    int iterations  = (wait/250);
    long startmilliSec = System.currentTimeMillis();
    for (int i = 0; i < iterations; i++)
    {
        if((System.currentTimeMillis()-startmilliSec)>wait)
            return false;
        List<WebElement> elements = driver.findElements(by);
        if (elements != null && elements.size() > 0)
            return true;
        Thread.sleep(250);
    }
    return false;
}

И ниже метод ожидания загрузки страницы:

public void waitForPageLoadingToComplete() throws Exception {
    ExpectedCondition<Boolean> expectation = new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver driver) {
            return ((JavascriptExecutor) driver).executeScript(
                    "return      document.readyState").equals("complete");
        }
    };
    Wait<WebDriver> wait = new WebDriverWait(driver, 30);
    wait.until(expectation);
}

Предположим, вы ожидаете загрузки страницы. Затем вызовите 1-й метод с временем ожидания и любым элементом, который появляется после загрузки страницы, тогда он вернет true, иначе false. Используйте это как,

waitForElementToBePresent(By.id("Something"), 20000)

Вышеупомянутая функция ждет, пока не найдет данный элемент в течение заданного времени.

Попробуйте любой из приведенных ниже кодов после вышеуказанного метода

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));

or

wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));

Обновлять:

public boolean waitForTextFiled(By by, int waitInMilliSeconds, WebDriver wdriver) throws Exception
    {
        WebDriver driver = wdriver;
        int wait = waitInMilliSeconds;
        int iterations  = (wait/250);
        long startmilliSec = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++)
        {
            if((System.currentTimeMillis()-startmilliSec)>wait)
                return false;
            driver.findElement(By.id("txt")).sendKeys("Something");
            String name =  driver.findElement(by).getAttribute("value");

            if (name != null && !name.equals("")){
                return true;
            }
            Thread.sleep(250);
        }
        return false;
    }

Это попытается ввести текст в текстовое поле до заданного времени в миллисекундах. Если getAttribute() в вашем случае не подходит, используйте getText(). Если текст введен, он возвращает true. Поставьте максимальное время, до которого вы можете ждать.

Ответ 2 · Sridevi Yedidha

Возможно, вы захотите попробовать это, чтобы элемент стал видимым на экране.

new WebDriverWait(10, driver).until(ExpectedConditions.visibilityOfElementLocated(By.id("jxxx")).

В этом случае время ожидания составляет максимум 10 секунд.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы