从 webdriver 覆盖 javascript 变量
Overwrite a javascript variable from webdriver
我不确定我的问题是否有任何解决方案,但不幸的是,我没有找到任何关于它的文章或信息。
情况如下。我们有一个大量使用 jQuery 的网站,并且有一个服务每隔 5 秒或第 10 秒刷新一次网站的一部分。由于这一半的时间,我从WebDriver收到此错误:
"Element not found in the cache - perhaps the page has changed since it was looked up"
根据互联网,当 DOM 树在初始化 WebElement 的那一刻和我想使用它来执行例如单击事件之间发生变化时,我会收到此错误。
根据我们的开发人员的说法,我们的jquery解决方案有一个变量来控制页面是否刷新。因此,要解决我的问题,我必须覆盖此变量。我必须以jQuery能够理解它的方式覆盖这个变量 - 我的意思是在同一实例中,如果这个定义在这种情况下是正确的。
所以,我想问一下是否可能?如果是这样,我想举一个小例子。
提前感谢!
安德拉斯
我只能同意Aleh的观点。
使用JavaScriptExecutor
是处理此类问题的唯一方法。
我在使用jQuery jNice库时遇到了问题,找不到任何其他解决方案。
下面是 Java 中用于填充文本字段的示例:
JavascriptExecutor js = (JavascriptExecutor) webDriver;
js.executeScript("document.getElementsByName('<field_name_gets_here>')[0].value='" + your_value + "'");
如果你提到的 JavaScript 变量是全局的,那么是的 - 你可以通过从 Selenium 执行 JavaScript 来覆盖它。例如,如果该变量被称为 doRefresh
,您可以通过执行 JS 来覆盖它,如下所示:来自 Selenium 的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执行JavaScript来将xhr对象放回原位(以便页面可以继续刷新和执行ajax):
// put the xhr object back
window.XMLHttpRequest = xhrHolder;
您可以尝试我的方法 - 我为页面可能正在加载的情况创建了自己的包装器。下面的代码部分尝试在循环中搜索元素,持续三秒钟(可配置)。顺便说一句,下面的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();
我相信这是可能的。c# 示例:
((IJavaScriptExecutor)driver).ExecuteScript("window.$('.class').data('var') = 0;")
- 调用类向后变量 (JavaScript)
- 初始化父类中的变量(JavaScript/CoffeeScript 习语)
- 可以'找不到变量javascript错误
- 输出数组变量javascript
- 自提交表单访问变量javascript
- 将变量 javascript 添加到用于旋转图像的链接中
- 在文本字段中显示保存的本地存储变量 - javascript
- 将变量添加到变量 JavaScript 中
- 获取要在变量 JavaScript 中使用的用户输入值
- 如何在变量 Javascript 中删除双引号
- 使用变量 javascript 从 json 文件中获取数据
- 读取输入和打印变量 - JavaScript 和 HTML 4.01
- 传递 PHP 变量 JavaScript 窗口位置
- 重置变量 JavaScript
- 变量 JavaScript 中的变量
- 尝试使用多个函数时无法使用全局变量 - JavaScript - 初学者
- 如何按值将数组分配给另一个变量 JavaScript
- setTimout 搞砸了变量 JavaScript
- 用内部函数变量更改外部函数变量?Javascript
- 根据变量 JavaScript 增加