1

我不确定我的问题是否有任何解决方案,但不幸的是,我还没有找到任何关于它的文章或信息。

情况如下。我们有一个大量使用 jQuery 的网站,并且有一项服务每 5 秒或 10 秒刷新一次网站的一部分。由于这一半的时间,我从 WebDriver 收到了这个错误:

"Element not found in the cache - perhaps the page has changed since it was looked up"

根据 Internet,当 DOM 树在 WebElement 被初始化和我想用它来执行(例如,单击事件)之间发生变化时,我得到了这个错误。

根据我们的开发人员的说法,我们的 jquery 解决方案有一个变量来控制页面是否刷新。所以,为了解决我的问题,我必须覆盖这个变量。我必须以 jQuery 能够理解的方式覆盖这个变量——我的意思是在同一个例子中,如果这个定义在这种情况下是正确的。

所以,我想问一下是否可以?如果是这样,比我想问一个小例子。

提前致谢!

安德拉斯

4

4 回答 4

4

我只能同意阿莱。

使用JavaScriptExecutor是处理此类问题的唯一方法。

我在使用 jQuery jNice 库时遇到了问题,找不到任何其他解决方案。

下面是一个用 Java 填充文本字段的示例:

JavascriptExecutor js = (JavascriptExecutor) webDriver;
js.executeScript("document.getElementsByName('<field_name_gets_here>')[0].value='" + your_value + "'");
于 2012-11-15T07:42:02.957 回答
2

如果您提到的 JavaScript 变量是全局的,那么可以 - 您可以通过从 Selenium 执行 JavaScript 来覆盖它。例如,如果该变量被调用doRefresh,您可以通过执行 JS 来覆盖它,如下所示doRefresh = false;

如果该变量不是全局变量,则上述内容将不起作用。但是,听起来有问题的元素可能是通过 ajax 动态加载的——在这种情况下,xhr对象是全局的,您可以访问它。

因此,首先您可以制作对象的本地副本,xhr然后通过从 Selenium 执行 JavaScript 来覆盖原始副本(有效地禁用它):

// create a copy of the xhr object for later use
var xhrHolder = window.XMLHttpRequest;

// overwrite the original object to disable it
window.XMLHttpRequest = {};

然后像往常一样通过 Selenium 找到你的元素。并继续您的测试。

完成后,您可以通过从 Selenium 执行 JavaScript 将 xhr 对象放回原处(以便页面可以继续刷新并执行 ajax):

// put the xhr object back
window.XMLHttpRequest = xhrHolder;
于 2013-05-31T20:12:53.563 回答
1

您可以尝试我的方法 - 我为可能正在加载页面的情况创建了自己的包装器。以下部分代码尝试在循环中搜索元素,持续三秒钟(可配置)。顺便说一句,driver下面的变量是WebDriver

private WebElement foundElement;
public WebElement find(By by){
    for (int milis=0; milis<3000; milis = milis+200){
        try{
            foundElement = driver.findElement(by);
        }catch (Exception e){
            try {
                Thread.sleep(200);
            } catch (InterruptedException e1) {
                e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
    }

    return foundElement;

}

稍后在代码中:

 WebElement submitButton = find(By.id("submitNewBid"));
 submitButton.click();
于 2012-04-24T15:00:23.073 回答
0

我相信这是可能的。c# 的示例:

((IJavaScriptExecutor)driver).ExecuteScript("window.$('.class').data('var') = 0;")
于 2012-04-25T10:21:44.153 回答