selenium web driver等待页面刷新

时间:2016-09-30 03:27:34

标签: selenium-webdriver wait page-refresh

下面是我的selenium测试用例的代码片段,其中我使用select方法从下拉列表中选择一个值。下一步是点击提交。但是当我尝试点击提交按钮时,页面没有刷新(这将刷新同一页面),抛出

  

元素不可点击,StaleElementReference异常

。对我有用的唯一解决方案是thread.sleep()

我尝试了以下所有选项,但没有运气:(

explicit wait()wait.until(Exceptedcontions.visibility)element to be clickable()等尝试了网络上的所有解决方案。

我必须在测试用例中使用thread.sleep() 3-4次,并且我有大约100个测试用例,这会耗费大量时间。

在点击提交按钮之前,Web驱动程序等待页面完全刷新并完全加载DOM的任何工作解决方案。

@Test
@Timeout(group = Group.SLOW)
public void testProvider() throws InterruptedException {

    proceedToProvider();
    new Select(driver.findElement(By.id("searchId"))).selectByVisibleText("Search");
    Thread.sleep(2000);
    driver.findElement(By.id("btnSubmit")).click();
    timeSplit("Search submitted");

以下是我使用其他解决方案时看到的错误。

  

org.openqa.selenium.WebDriverException:未知错误:元素不是   可点击(1289,141)。其他元素将收到点击:      (会议信息:chrome = 53.0.2785.116)(驱动信息:   chromedriver = 2.21.371459   (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform = Windows NT 6.1 SP1   x86_64)(警告:服务器未提供任何堆栈跟踪   信息)命令持续时间或超时:168毫秒构建信息:   版本:'2.49.1',修订版:   '808c23b0963853d375cbe54b90bbd052e2528a54',时间:'2016-01-21   09:37:52'系统信息:主持人:'ALAKASIMA01-W7L',ip:'10 .145.45.233',   os.name:'Windows 7',os.arch:'amd64',os.version:'6.1',   java.version:'1.8.0_73'驱动程序信息:   org.openqa.selenium.remote.RemoteWebDriver功能   [{applicationCacheEnabled = false,rotate = false,   mobileEmulationEnabled = false,chrome = {chromedriverVersion = 2.21.371459   (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),   userDataDir = C:\用户\ kasima01 \应用程序数据\本地\ TEMP \ scoped_dir6628_12218},   takesHeapSnapshot = true,databaseEnabled = false,handlesAlerts = true,   hasTouchScreen = false,版本= 53.0.2785.116,platform = XP,   browserConnectionEnabled = false,nativeEvents = true,   acceptSslCerts = true,locationContextEnabled = true,   webStorageEnabled = true,browserName = chrome,takesScreenshot = true,   javascriptEnabled = true,cssSelectorsEnabled = true}]会话ID:   8bf0b4cc7efc715015509f4be345d14d

2 个答案:

答案 0 :(得分:0)

public void WaitForElementToLoad(String selector, String key, String seconds)
            throws ValidationException {

        Integer time = Integer.valueOf(seconds);

        WebElement element = null;

        while (time > 0) {

            try {
                element = getSpecificWebElement(selector, key);

                break;
            } catch (ValidationException e) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                time--;
            }
        }

        if (element == null && time <= 0) {
              // throw your own exception
        }
    }

上述方法显示了执行此操作的基本方法之一。 getSpecificWebElement是一个可以自己定义的方法,使用findElementByXX并抛出自己的异常进行捕获。通过上限,您将等待特定元素。

还有另一种解决方案 - 使用driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

  

指定驱动程序在搜索元素时应等待的时间(如果元素不立即存在)。

<强>更新

我想我最好发布getSpecificWebElement

private WebElement getSpecificWebElement(String selector, String key)
            throws ValidationException {
        WebElement element = null;

        String expression = "";

        By by = composeSelector(selector, key);

        try {
            element = FindElementBy(by);
        } catch (TimeoutException e) {

            throw new ValidationException("not found " + expression);
        } catch (Exception e) {
            throw new ValidationException(
                    Exceptions.getShortStackTraceAsString(e));
        }

        return element;
}


private WebElement FindElementBy(By by) {

        final By selector = by;

        ExpectedCondition<WebElement> ec = new ExpectedCondition<WebElement>() {

            @Override
            public WebElement apply(WebDriver driver) {

                return driver.findElement(selector);

            }

        };

        WebDriverWait wait = new WebDriverWait(driver, 10);

        return wait.until(ec);
    }

在这种情况下,等待时间足够,将是X(传递的秒值)* 10.

答案 1 :(得分:0)

试试这会检查整个页面是否已加载?

    static void waitForPageLoad(WebDriver wdriver) {
    WebDriverWait wait = new WebDriverWait(wdriver, 60);

    Predicate<WebDriver> pageLoaded = new Predicate<WebDriver>() {

        @Override
        public boolean apply(WebDriver input) {
            return ((JavascriptExecutor) input).executeScript("return document.readyState").equals("complete");
        }

    };
    wait.until(pageLoaded);
}

希望这对你有用。