【问题标题】:selenium web driver wait until page to refreshselenium web driver 等到页面刷新
【发布时间】:2016-09-30 03:27:34
【问题描述】:

下面是我的 selenium 测试用例的代码 sn-p,我使用 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)(驱动程序信息: 铬驱动程序=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),平台=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, 可旋转=false, mobileEmulationEnabled=false,chrome={chromedriverVersion=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4), userDataDir=C:\Users\kasima01\AppData\Local\Temp\scoped_dir6628_12218}, 需要HeapSnapshot=true,databaseEnabled=false,handlesAlerts=true, hasTouchScreen=false,版本=53.0.2785.116,平台=XP, browserConnectionEnabled=false,nativeEvents=true, acceptSslCerts=true,locationContextEnabled=true, webStorageEnabled=true,browserName=chrome,takeScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}] 会话 ID: 8bf0b4cc7efc715015509f4be345d14d

【问题讨论】:

    标签: selenium-webdriver wait page-refresh


    【解决方案1】:
    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。

    【讨论】:

    • @Test @Timeout(group = Group.SLOW) public void testProviderSearchDataShareOn() throws InterruptedException, ValidationException {proceedToProviderScreen();新的 Select(driver.findElement(By.id("searchId"))).selectByVisibleText("Search"); // 线程.sleep(2000); WaitForElementToLoad("id","btnSubmit","20");相同元素不可点击错误。
    • 考虑一些元素覆盖了你的目标元素。您需要移除障碍。
    【解决方案2】:

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

        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);
    }
    

    希望这对你有用。

    【讨论】:

    • 不走运,只要 new Select(driver.findElement(By.id("searchId"))).selectByVisibleText("Search");执行时,驱动程序抛出元素不可点击异常。
    • 你在select语句之前调用waitForPageLoad了吗?
    • 我实际上在 select 语句之后得到了错误。我在进程按钮上的 click() 之前尝试了 waitForPageLoad ()。
    • 试试这个 WebDriverWait wait = new WebDriverWait(driver, 15); wait.until(ExpectedConditions.elementToBeClickable(By.id("btnSubmit")); driver.findElement(By.id("btnSubmit")).click();
    猜你喜欢
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多