5

我将 selenium 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 等待根本不起作用。伙计们,我做错了什么吗?非常感谢提前

4

4 回答 4

3

听起来你正遭受陈旧元素的折磨。

Selenium 找到的每个 WebElement 实际上都是对 DOM 内元素的引用

有时网站上使用的 JavaScript 会破坏并重新创建一个元素,当这种情况发生时,您现有的引用变得陈旧,您将看到 StaleElementReferenceException(至少在 Java 领域是这样称呼的,您应该看到非常相似的东西)。

因此,如果您看到 StaleElementReferenceException 或一条消息指出“元素不再附加到 DOM”,这意味着您曾经拥有的对 DOM 中元素的引用不再有效,因为您引用了该元素已被摧毁。

这在视觉上并不总是很明显,因为原始元素可能已被破坏,然后重新创建了相同的元素,但它是一个新元素,因此您需要创建一个新的引用来与之交互。

创建新引用的方法是再次找到该元素。

您的问题并不完全清楚,但我假设您在找到表格后遍历锚元素列表时遇到了问题。如果是这种情况,则表明该表已被销毁并在您找到表元素的点之间重新创建,然后开始遍历表内的锚元素。

如果是这种情况,您将需要再次找到该表,一个有用的技巧是等待该表变得陈旧,然后再尝试再次找到它。通过这种方式,您可以合理地确信页面上正在销毁表然后重新创建它的任何 JavaScript 都已完成处理。.NET ExpectedConditions 类不如Java ExpectedConditions 类成熟。我建议查看一些 Java 并将它们移植到 .NET(它应该相当简单,结构非常相似),特别感兴趣的是等待元素变得陈旧的 Java。

于 2013-07-08T09:07:45.393 回答
1

我相信该页面的某些表格已被删除。查看页面上的事件会很有用。您应该使用//table[@class='boxVerde']/tr/td/div/axpath 而不是在元素内部进行搜索。

于 2013-07-09T14:24:38.957 回答
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("anchor tag text"); 找到您的元素

       iwe.FindElements(By.linkText("anchor tag text"));
于 2013-07-09T09:46:07.443 回答
-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;
            }                       
        }
于 2013-05-17T11:57:00.270 回答