2012-04-24 23 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;