2013-04-04 23 views
5

我申請硒webdriverwait方法特定IWebElement webdriverwait可用時獲取此IWebElement的一些子元素。這是我的代碼...使用在特定IWebElement

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); 
IList<IWebElement> elementsA = wait.Until<IList<IWebElement>>((d) => 
{ 
    return driver.FindElements(By.XPath("//table[@class='boxVerde']")); 
}); 

foreach (IWebElement iwe in elementsA) 
{ 
     wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); 
     IList<IWebElement> elementsB = wait.Until<IList<IWebElement>>((d) => 
     { 
      return iwe.FindElements(By.XPath("tr/td/div/a")); 
      //trying to fetch the anchor tags from the element 
     }); 
} 

它不斷給我一個錯誤說「元素不再連接到DOM」 ......我認爲webdriver的等待是根本無法工作。我做錯了什麼人嗎?非常感謝提前

+0

什麼版本的硒?該瀏覽器的瀏覽器和版本是什麼?嘗試使用與您的XPath查詢相同的CSS選擇器?你甚至需要等待嗎? – Arran 2013-04-04 08:29:20

+0

嗨Arran,我使用chromedriver_win_26.0.1383.0和硒版本2 ...還沒有嘗試CSS選擇器。老實說,我不認爲我需要等待,因爲在我打電話之前我沒有改變dom,但是因爲它已經通過了,所以staleElementReferenceException的元素不再附加到DOM上了。我假設我不知道要等待什麼...... – 2013-04-04 08:45:45

+0

你有什麼版本的Chrome?硒版本2點什麼?最新版本是v2.31,你在用它嗎? – Arran 2013-04-04 08:54:48

回答

-1

嘗試使用此。它等待元素出現在頁面中。

static void ForElementsArePresent(IWebDriver wd, double waitForSeconds, By by) 
     { 
      try 
      { 
       WebDriverWait wait = new WebDriverWait(wd, TimeSpan.FromSeconds(waitForSeconds)); 
       wait.Until(x => (x.FindElements(by).Count > 0)); 
      } 
      catch (WebDriverTimeoutException) 
      { 
       Console.WriteLine("Waiting for element " + by + " to disappear timed out after " + waitForSeconds + " seconds."); 
       throw; 
      }      
     } 
3

聽起來好像你患有陳舊的元素。

每WebElement硒發現實際上是在網站上使用會破壞並重新創建元素的DOM

有時JavaScript的內部元素的引用,當發生這種情況您現有的參考變得陳舊,你會看到一個StaleElementReferenceException(至少這就是它在Java領域所稱的,你應該看到一些非常相似的東西)。

因此,如果您看到StaleElementReferenceException或消息指出「元素不再附加到DOM」,這意味着您曾經擁有的DOM元素的引用不再有效,因爲元素有一個參考已被銷燬。

這並不總是顯而易見的視覺,因爲原始的元素可能已被破壞,然後一個相同重建,它不過是一個新的元素,所以你需要創建一個新的參考與它進行交互。

創建一個新的參考的方法是重新找到的元素。

這不是從你的問題完全清楚,但我假設查找表後,通過錨元素的列表迭代時,你所得到的問題。如果是這種情況,則表明該表已被銷燬並在您找到表元素之間重新創建,然後開始遍歷表內的錨元素。

如果這是你需要再次找到表的情況下,一個有用的技巧是等待表變得陳舊你嘗試再次找到它。通過這種方式,您可以合理地確信,頁面上銷燬表並重新創建表的任何JavaScript已經完成處理。 .NET ExpectedConditions class不像Java ExpectedConditions class成熟。我會建議看看一些Java並將它們移植到.NET中(它應該相當平凡,結構非常相似),特別感興趣的是等待元素陳舊的Java。

+0

不錯,如果誰投了票會解釋爲什麼考慮上述所有的是正確的... – Ardesco 2013-07-12 15:25:28

0

你必須定義你的webdriver等待忽略例外,直到投票的時間接管。以下java方法輪詢元素util 60秒,如果它被加載則返回,否則將拋出超時異常。請將此轉換爲你需要的語言。(對不起,我是一個javaist)

public WebElement fluentWait(final By locator, WebDriver driver) { 
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
    .withTimeout(60, TimeUnit.SECONDS) 
    .pollingEvery(1, TimeUnit.SECONDS) 
    .ignoring(StaleElementReferenceException.class) 
    .ignoring(NoSuchElementException.class); 
    WebElement foo = wait.until(
    new Function<WebDriver, WebElement>() { 
    public WebElement apply(WebDriver driver) { 
    return driver.findElement(locator); 
    } 
     } ); 
    return foo;} 

此外,如果你正在尋找一個錨標記元素使用XPath作爲

 iwe.FindElements(By.XPath(" //a[text()='anchor tag text']")); 

或通過By查找你的元素。linkText(「錨標記文本」);

 iwe.FindElements(By.linkText("anchor tag text")); 
1

我相信一些表已被刪除的頁面。查看頁面上的事件會很有用。您應該使用//table[@class='boxVerde']/tr/td/div/a xpath,而不是在元素內進行搜索。

+0

如果,如您所建議,如果表已被刪除這一頁? – Ardesco 2013-07-12 15:26:01

相關問題