Selenium.click在等待操作完成时超时

Selenium.click在等待操作完成时超时,selenium,webdriver,selenium-rc,Selenium,Webdriver,Selenium Rc,我正在Eclipse中使用Java运行selenium RC。我遇到的问题是selenium.click命令。我单击的链接将加载一个新页面。有时需要5秒,有时需要2-3分钟。每次我看到页面加载时,以及测试失败后,我收到消息“超时等待操作完成” 我尝试使用selenium.isElementPresent来检查正在加载的页面。但是,当我在调试模式下运行时,我注意到它永远不会超过selenium。单击甚至可以检查元素。据我所知,selenium.click命令中内置了等待。所以我的问题是,有没有人知

我正在Eclipse中使用Java运行selenium RC。我遇到的问题是selenium.click命令。我单击的链接将加载一个新页面。有时需要5秒,有时需要2-3分钟。每次我看到页面加载时,以及测试失败后,我收到消息“超时等待操作完成”

我尝试使用selenium.isElementPresent来检查正在加载的页面。但是,当我在调试模式下运行时,我注意到它永远不会超过selenium。单击甚至可以检查元素。据我所知,selenium.click命令中内置了等待。所以我的问题是,有没有人知道如何忽略内置的等待,这样我就可以改用selenium.isElementPresent

selenium.click(Link);
for (int i = 0; i < 60 ; i++) {
    if (selenium.isElementPresent(Home)) {
       break;
    }
    Thread.sleep(1000);
}
selenium。单击(链接);
对于(int i=0;i<60;i++){
如果(硒元素存在(家庭)){
打破
}
睡眠(1000);
}

我还尝试使用selenium.open直接转到URL并完全跳过链接,然后使用selenium.isElementPresent验证页面是否已加载。我在那里遇到了同样的问题,在出现同样的错误消息失败之前,它从未真正进入for循环。

我也遇到过同样的问题。我只是用try/catch包装了click命令,以便捕获错误,然后执行了assert title并检查了页面上的预期文本。

解决方案取决于您正在测试的应用程序的性质。如果单击操作加载一个新页面,则可以使用selenium的waitForPageToLoad命令,如下所示:

selenium.click(Link);
selenium.waitForPageToLoad(60000);
注意:该参数是以毫秒为单位的超时值。因此,这将等待长达60秒的页面加载

对于点击等待功能,最好的解决方法可能是使用Selenium的waitForCondition方法:

selenium.waitForCondition("selenium.isElementPresent(\"Home\")", 60000);

Selenium连续运行isElementPresent方法,直到它返回true或达到作为第二个参数给定的超时值。此外,
selenium.waitForCondition
可以运行
selenium.isTextPresent
,在继续脚本之前检查屏幕上是否有文本。

我建议您将此方法/函数合并到代码中

    public static void WaitForPageToLoad(IWebDriver driver)
    {
        TimeSpan timeout = new TimeSpan(0, 0, 2400);
        WebDriverWait wait = new WebDriverWait(driver, timeout);

        IJavaScriptExecutor javascript = driver as IJavaScriptExecutor;
        if (javascript == null)
            throw new ArgumentException("driver", "Driver must support javascript execution");

        wait.Until((d) =>
        {
            try
            {
                string readyState = javascript.ExecuteScript("if (document.readyState) return document.readyState;").ToString();
                return readyState.ToLower() == "complete";
            }
            catch (InvalidOperationException e)
            {
                //Window is no longer available
                return e.Message.ToLower().Contains("unable to get browser");
            }
            catch (WebDriverException e)
            {
                //Browser is no longer available
                return e.Message.ToLower().Contains("unable to connect");
            }
            catch (Exception)
            {
                return false;
            }
        });
    }
selenium的.Click()有时会等待自引用响应。为了超越这一点,并让您的测试继续进行,我将对您的代码执行以下操作

    driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));

    try{ selenium.click(Link); }
    catch(WebDriverException) {}
    WaitForPageToLoad(driver); 
    //look for your element.

将其与隐式等待相结合,一旦JavaScript报告页面已完成加载,就可以查找元素。我发现它比在60秒内没有找到元素更具动态性

您永远不会转到
中的
语句。应该是
for(inti=0;i<60;i++)
。打字错误在问题中,但不是实际的代码,所以我在这里修复了它。但同样的问题仍然存在。实际上,我在这里遇到的问题是,我的测试从未通过selenium.click命令,甚至无法访问selenium.waitForPageToLoad或selenium.waitForCondition。selenium.click似乎有一个内置的等待,我似乎无法使用任何其他方法来验证页面是否已加载。我在2019年来到这里,遇到了这个问题,你找到了解决方法吗?实际上,用try/catch来解决它非常有效。我仍然可以捕获错误,但不能让它通过测试,这样我就可以使用其他方法确认加载的页面。谢谢你的建议。