【问题标题】:Selenium - C# - Webdriver - Unable to find elementSelenium - C# - Webdriver - 无法找到元素
【发布时间】:2014-05-29 19:53:26
【问题描述】:

在 C# 中使用 selenium 我正在尝试打开浏览器,导航到 Google 并找到文本搜索字段。

我试试下面的

IWebDriver driver = new InternetExplorerDriver(@"C:\");

driver.Navigate().GoToUrl("www.google.com");

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5));

IWebElement password = driver.FindElement(By.Id("gbqfq"));

但得到以下错误 -

无法找到 id == gbqfq 的元素

【问题讨论】:

  • 您使用的是哪个版本的 Internet Explorer? Selenium Web Driver 对 IE 11 的支持存在已知问题。
  • 另外,我诚实的建议是使用Google 以外的任何其他网页。不幸的是,大多数人选择 Google 作为 Selenium 工作的“起始应用程序”,但到目前为止,它是您会遇到的最复杂的网站之一(即标记是地狱,并且被大量最小化) - 您会遇到工作问题与谷歌的网站,你不会与其他人。为自己省去一开始的麻烦!
  • 您可能已经检查过了——但该 ID 不是动态生成的,对吧?如果是这样,那么 ID 将不是查找元素的可靠方法...

标签: c# selenium selenium-webdriver webdriver


【解决方案1】:

这看起来像是已经回答的this question 的副本。

我可以告诉你我做了什么,这对我来说似乎很有效:

public static IWebElement WaitForElementToAppear(IWebDriver driver, int waitTime, By waitingElement)
{
        IWebElement wait = new WebDriverWait(driver, TimeSpan.FromSeconds(waitTime)).Until(ExpectedConditions.ElementExists(waitingElement));
        return wait;
}

这应该等待 waitTime 时间,直到找到或不找到元素。我遇到了很多动态页面没有立即加载我需要的元素以及 WebDriver 试图以比页面加载它们更快的速度找到元素的问题,这是我的解决方案。希望对您有所帮助!

【讨论】:

    【解决方案2】:

    您可以尝试使用旋转等待

    int timeout =0;
    while (driver.FindElements(By.id("gbqfq")).Count == 0 && timeout <500){
      Thread.sleep(1);
      timeout++;
    
     }
     IWebElement password = driver.FindElement(By.Id("gbqfq"));
    

    这应该有助于确保元素确实有时间出现。

    另请注意,“gbqfq” id 有点气味。我可能会尝试一些比那个 id 更有意义的匹配。

    【讨论】:

    • 这只是WebDriverWait的重新实现。此外,Count 应替换为 Any
    猜你喜欢
    • 2014-11-12
    • 2014-07-13
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2016-08-31
    相关资源
    最近更新 更多