Java 从selenium处理自刷新页面

Java 从selenium处理自刷新页面,java,javascript,selenium,Java,Javascript,Selenium,我在一些java selenium rc测试中遇到了间歇性错误,我认为这些测试与一个页面有关,该页面具有ajax轮询,并且在服务器上达到某种条件时自动刷新。在这个场景中,我无法要求selenium等待页面加载,因此我遇到了一系列随机的“无法访问document.body”错误 那么,有没有办法让selenium优雅地处理这种情况?如果没有,是否有某种方法可以从页面的javascript中检测用户是否为selenium,并禁用自动刷新 如果有帮助的话,页面中的javascript代码看起来像 va

我在一些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));
        }
    }
});

我想你可以暂停,或者点击等待。谷歌上有很多。祝你好运

编辑您的评论:


那么?

一种解决方案可能是在尝试与被测应用程序交互之前,始终使用
isElementPresent
使用
waitForCondition
。您可以将以下方法放在超类中,以使测试更具可读性。或者,您可以为执行此等待的常用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问题。

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

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

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

在这里,我遇到了同样的问题,我使用了一行代码,这很有帮助

我得到关于页面自动刷新的错误 再加上这个警告:

-1490472087141使用不推荐的数据结构设置超时的木偶警告

我用的就是

Thread.sleep(2000) 

这对我很有效

问题是,刷新是由基础页面触发的,而不是由selenium触发的,因此selenium没有时间知道它需要调用pause或clickAndWait。@Matt页面重新加载时会发生什么变化某些被禁用的链接变为重新启用-与测试无关。理想情况下,我们可以使用ajax或其他工具将页面更新到新状态,但与此页面刷新机制相比,这项工作需要付出大量的努力。看起来我可能能够检测到在selenium下运行的类似于或的工具。我明天会试试……页面刷新不能在waitForCondition完成(成功)后,但在下一个测试步骤开始之前仍然发生,导致下一个步骤失败吗?如果WaITFREST条件开始时,页面处于刷新状态,这可能会有帮助。-谢谢。不幸的是,它仍然是可能的,是的。由于页面尚未加载任何内容,该页面也可能处于命令返回失败的状态。在这种情况下,我不得不等待窗口名出现在以前的项目中。我想我必须考虑在Selenium下运行时尝试禁用刷新-谢谢。看起来是一个很好的解决方法。我很怀疑你是否需要改变你的应用程序以适应你的测试,但听起来你似乎别无选择。