【问题标题】:Handling self-refreshing pages from selenium处理来自 selenium 的自刷新页面
【发布时间】:2011-01-11 22:56:20
【问题描述】:

我在一些 java selenium-rc 测试中遇到了间歇性错误,我认为这些错误与具有 ajax 轮询并在服务器上达到某些条件时自动刷新的页面有关。在这种情况下,我无法让 selenium 等待页面加载,因此我遇到了一堆随机的“无法访问 document.body”错误。

那么,有什么方法可以让 selenium 优雅地处理这种情况吗?如果没有,有什么方法可以从页面的 javascript 中检测用户是否是 selenium,并禁用自动刷新?

如果它有帮助,页面中的 javascript 代码看起来像......

var ajax = new Ajax(url, { 
    update: state,
    method: 'get',
    onComplete: function(message) {
        if (some_condition) {
            window.location.replace(unescape(window.location));
        }
    }
});

【问题讨论】:

  • @Matt 页面重新加载时会发生什么变化
  • 一些被禁用的链接重新启用 - 与测试无关。理想情况下,我们会使用 ajax 或其他方式将页面更新到新状态,但与这种页面刷新机制相比,这样做所需的工作量很大。
  • 看起来我可能能够使用nerd.metrocat.org/2009/10/detecting-seleniumthoughtstoblog.blogspot.com/2009/09/… 之类的东西检测到在 selenium 下运行。明天我会试一试...

标签: java javascript selenium


【解决方案1】:

我也遇到了同样的问题,我只用了一行代码就可以了。

我收到有关页面正在自动刷新的错误 加上这个警告:

-1490472087141 Marionette WARN 使用已弃用的数据结构设置超时

我只用了

Thread.sleep(2000) 

它对我有用。

【讨论】:

    【解决方案2】:

    我的解决方案是禁用 javascript 中的刷新,方法是将其包装在以下内容中...

    var isSeleniumActive = parent.seleniumAlert;
    if (isSeleniumActive) {
        alert("Selenium");
    } else {
        alert("Not selenium");
    }
    

    我不确定这里的 seleniumAlert 函数是否可能永远存在问题,因此请注意,如果您正在使用它,您可能依赖于 selenium 的内部 selenium 实现细节。

    【讨论】:

    • 看起来是一个很好的解决方法。我会质疑是否必须更改您的应用以适应您的测试,但听起来您别无选择。
    【解决方案3】:

    一种解决方案可能是在尝试与被测应用程序交互之前始终使用waitForConditionisElementPresent。您可以将以下方法放在超类中,以使您的测试更具可读性。或者,您可以为执行此等待的常见 Selenium 命令创建辅助方法。

    /** Waits for an element to be present */
    public static void waitForElementToBePresent(String locator) {
        session().waitForCondition("var value = selenium.isElementPresent('" + locator.replace("'", "\\'") + "'); value == true", "60000");
    }
    

    您可能还想等待元素可见,因为等待它出现并不总是足够的(想象一个始终存在但在特定条件之前隐藏的文本框)。您可以将其与上述方法结合使用:

    /** Waits for an element to be visible */
    public static void waitForElementToBeVisible(String locator) {
        waitForElementToBePresent(locator);
        session().waitForCondition("var value = selenium.isVisible('" + locator.replace("'", "\\'") + "'); value == true", TIMEOUT);
    }
    

    顺便说一句,WebDriver (Selenium 2) 团队正在研究隐式等待,专门解决元素不立即出现的 AJAX 问题。

    【讨论】:

    • 难道在waitForCondition完成(成功)之后,但在下一个测试步骤开始之前,页面刷新仍然发生,导致下一步失败?如果在 waitForCondition 启动时页面处于刷新中间,此解决方案可能会有所帮助 - 谢谢。
    • 不幸的是,它仍然有可能,是的。由于页面尚未加载任何内容,因此页面也可能处于命令返回失败的状态。在这种情况下,我不得不等待窗口名称存在于以前的项目中。
    • 猜猜我必须考虑在 Selenium 下运行时尝试禁用刷新 - 谢谢。
    【解决方案4】:

    我认为您可以暂停,或者单击并等待。 google上有a fewgood articles。祝你好运。

    编辑您的评论:

    waitFor command 怎么样?

    【讨论】:

    • 麻烦的是,刷新是由底层页面触发的,而不是 selenium,所以 selenium 没有时间知道它需要调用 pause 或 clickAndWait。
    猜你喜欢
    • 2013-05-23
    • 2012-09-09
    • 2018-01-05
    • 2012-07-21
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多