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


那么,有什么方法可以使硒正常处理这种情况?如果不是,是否可以通过某种方式从页面的javascript中检测用户是否为硒,并禁用自动刷新?


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

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


#1 楼

在这种情况下,您可以等待Ajax请求完成。

这样,即使页面已加载,您也不必担心。 ajax请求完成后,请继续。

您可以这样操作:

        selenium.waitForCondition(
            "selenium.browserbot.getCurrentWindow().jQuery.active == 0",
            timeout);


其中超时是可选的整数参数。

评论


在您发布此内容时正在写答案。我认为我将以自己的自动化方式来实现您的解决方案,因为这似乎效率更高。

– Lyndon Vrooman
2011年5月6日,11:12

只是等待ajax请求和onComplete处理程序完成,还是等到新页面(由window.location.replace加载)被完全加载?

–马特·谢泼德(Matt Sheppard)
2011年5月6日,11:12

@Lyndon:谢谢你。 :) @Matt:这实际上等待每个jQuery请求完成。它会一直等到jQuery在您页面上所做的一切都完成后,甚至持续一微秒。如果jQuery进入状态:active = 0,则您的程序将继续。当然,这仅对jQuery有效,但是您可以对其进行编辑以表示所使用的任何工具。顺便说一句,如果您不使用jQuery,则应该感到羞耻。 :D

–汉尼拔
2011年5月6日,11:26

谢谢-我会尝试的。我仍然不确定它是否会工作,因为我已经假设,当window.location.replace开始加载新页面时,旧的jquery上下文将需要被销毁。假设发生这种情况,除非正在加载的新页面将jquery用于某件事,否则jquery实际上不会再次变为活动状态,即使那样,在页面加载过程中也会有一些不活动的地方。就是说,我不确定,所以我将对其进行测试,看看您是否正确,jQuery.active可以通过页面加载而存活。

–马特·谢泼德(Matt Sheppard)
11年5月8日在11:18

是的,我希望对您有所帮助。毕竟这只是一个主意。我真的希望至少能帮助您到那里。

–汉尼拔
2011年5月9日7:08

#2 楼

如果Hannibal的答案不起作用,那么对于加载时间很长的页面来说,对我有用的是在导致页面刷新的操作之后立即添加调用方法,或者在下一个操作开始时添加,检查是否确实存在将始终存在于页面上的特定元素。

#3 楼

简单的解决方案是让selenium执行脚本以覆盖/禁用自我刷新的javascript。
selenium rc是selenium 1,但是无论如何,可以同时使用两个驱动程序来执行javascript。

除此之外,@ Hannibal还有一个很好的解决方案,我很可能会自己这样做