我遇到了一些java selenium-rc测试的间歇性错误,我认为这些测试与具有ajax轮询的页面有关,并且在服务器上达到某些条件时会自动刷新。在这种情况下,我无法让selenium等待页面加载,因此我遇到了一堆随机的“无法访问document.body”错误。
那么,有什么方法可以让硒优雅地处理这种情况吗?如果没有,有什么方法可以检测用户是否是页面的javascript中的selenium,并禁用自动刷新?
如果它有帮助,页面中的javascript代码看起来像......
var ajax = new Ajax(url, {
update: state,
method: 'get',
onComplete: function(message) {
if (some_condition) {
window.location.replace(unescape(window.location));
}
}
});
答案 0 :(得分:1)
一种解决方案可能是在尝试与测试中的应用程序进行交互之前始终使用waitForCondition
isElementPresent
。您可以将以下方法放在超类中,以使您的测试更具可读性。或者,您可以为执行此等待的常见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问题。
答案 1 :(得分:1)
我的解决方案是通过将其包装在以下内容中来禁用javascript中的刷新...
var isSeleniumActive = parent.seleniumAlert;
if (isSeleniumActive) {
alert("Selenium");
} else {
alert("Not selenium");
}
我不确定这里的seleniumAlert功能是否可能永远存在,所以请注意,如果你这样做,你可能依赖于硒的内部硒实施细节。
答案 2 :(得分:0)
我遇到了同样的问题,我使用了一行代码而且有帮助。
我收到有关该页面的错误正在自动刷新 加上这个警告:
-1490472087141 Marionette WARN使用弃用的数据结构来设置超时
我使用的全部是
Thread.sleep(2000)
它对我有用。
答案 3 :(得分:-1)