2012-04-24 73 views
1

我不确定是否有任何解决方案,我的问题,但不幸的是,我没有找到任何文章或关于它的信息。覆盖从webdriver的JavaScript变量

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

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

据互联网我得到这个错误时,DOM树已一瞬之间变化时,WebElement已初始化,当我想用它执行,例如,一个点击事件。

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

那么,我想问问是否可能?如果是这样,我想问一个小例子。

在此先感谢!

安德拉斯

+0

代码:

完成后,您可以通过从硒执行JavaScript把XHR对象放回原处(这样的页面可以继续清爽做AJAX)?样品?什么? – RASG 2012-04-24 14:00:31

+0

我无法提供代码,因为它属于我们的客户。另一方面,没有必要,因为我不知道应该包含示例代码。我想描述一下问题所在。如果没有,比我再试一次。 :) – SayusiAndo 2012-04-24 14:09:58

+0

所以你的问题是关注测试用例 - 而不是实际的实现? – madflow 2012-04-24 14:31:17

回答

1

你可以试试我的方法 - 我创造了我自己的包装器,其中页面可能加载的情况。下面的代码部分尝试在循环中搜索元素,三秒(可配置)。 BTW以下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(); 
+0

我明白你的解决方案的重点,非常感谢你,它会很有用! – SayusiAndo 2012-04-25 08:01:27

0

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

((IJavaScriptExecutor)driver).ExecuteScript("window.$('.class').data('var') = 0;") 
4

我只能同意Aleh。

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

我有jQuery jNice库的问题,找不到任何其他解决方案。

这里是填充文本字段在Java中的例子:

JavascriptExecutor js = (JavascriptExecutor) webDriver; 
js.executeScript("document.getElementsByName('<field_name_gets_here>')[0].value='" + your_value + "'"); 
2

如果你提到的JavaScript变量是全球性的,那么是的 - 你可以从你的硒执行JavaScript覆盖它。例如,如果该变量名为doRefresh,则可以通过执行如下所示的JS来覆盖它:来自Selenium的doRefresh = false;

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

所以,首先可以使xhr对象的本地副本,然后由硒执行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找到你的元素,你通常会。并继续你的测试。

// put the xhr object back 
window.XMLHttpRequest = xhrHolder;