2013-04-04 76 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