将 Selenium 与 Chrome 版本 74 配合使用:发生意外的 NoSuchElementException

Using Selenium with Chrome version 74: unexpected NoSuchElementException occurs

提问人:KarkMump 提问时间:5/9/2019 最后编辑:C. PeckKarkMump 更新时间:5/9/2019 访问量:503

问:

我正在尝试将 Selenium 与 chrome 的 74 版一起使用。我按照文档的说明从 Selenium 和 ChromeDriver 下载了最新的更新。这是我在升级前的功能代码 -

IWebDriver driver = new ChromeDriver();

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(8));
{
    driver.Url = "https://iam.mySite.com";
};

但是升级后我开始出现错误

OpenQA.Selenium.DriverServiceNotFoundException: 'The chromedriver.exe file 
does not exist in the current directory or in a directory on the PATH 
environment variable. The driver can be downloaded at http://chromedriver.storage.googleapis.com/index.html

由于这个错误,我将我的代码更改为这个

IWebDriver driver = new ChromeDriver(@"C:\Users\UserName\.nuget\packages\selenium.webdriver.chromedriver\74.0.3729.6\driver\win32");
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(8));
{
    driver.Url = "https://iam.mySite.com";
};

但是现在我收到这个错误 -

OpenQA.Selenium.NoSuchElementException: 'no such element: Unable to locate element: 
{"method":"xpath","selector":"//*[@id='username']"}
  (Session info: chrome=74.0.3729.131)
  (Driver info: chromedriver=74.0.3729.6)

我仔细检查了用户名xpath,它没有改变。有没有简单的方法可以降级我的 chrome 版本?我是否将驱动程序放在错误的文件夹中?

C# 硒 硒 webdriver chrome-web驱动程序

评论

0赞 C. Peck 5/9/2019
您的浏览器是否正常启动?似乎 Selenium 认为是这样。如果是这样,我无法想象您的 chrome 版本或其位置是问题所在。
0赞 JeffC 5/9/2019
您发布了一条异常消息,该消息引用了您发布的代码中不存在的异常消息。为了能够为您提供帮助,您需要发布一个最小的可重现示例以及运行该代码的错误/异常消息。此外,你使用的是 NuGet,无需指定 ChromeDriver 路径。.FindElement(By.XPath("//*[@id='username']"))

答:

0赞 eugene.polschikov 5/9/2019 #1

@karkMump,一旦您确保 selenium 启动正常且配置正确 - 尝试不同的等待机制,例如:

  • 显式等待
  • 隐式等待
  • Fluent Wait(在 Java 绑定中)

并将其应用于页面上的 WebElement。

使用 C# 等待某些特定 elemenents 的一些代码示例:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(1));
IWebElement element = wait.Until<IWebElement>(ExpectedConditions.ElementIsVisible(By.TagName("textarea")));

或者,如果您需要对等待的特定设置进行更多控制,可以执行以下操作:

DefaultWait<IWebDriver> wait = new DefaultWait(driver);
wait.Timeout = TimeSpan.FromSeconds(1);
wait.PollingInterval = TimeSpan.FromMilliseconds(100);
wait.IgnoreExceptionTypes(typeof(NoSuchElementException));
IWebElement element = wait.Until<IWebElement>((d) =>
{
    return d.FindElement(By.TagName("textarea"));
});

如果你真的想把它变成一种格式,你可以传递任何你想要的定位器,用另一种方法包装它,如下所示:

public IWebElement WaitForElementVisible(By locator, TimeSpan timeout)
{
    WebDriverWait wait = new WebDriverWait(driver, timeout);
    IWebElement element = wait.Until<IWebElement>(ExpectedConditions.ElementIsVisible(locator));
}

关于 C# 的注释,特定于 c# 中的默认等待:默认等待是更通用的等待,因为它没有绑定到 WebDriver。此等待可用于传入任何要等待的对象。下面是代码示例(等待页面上某些特定元素的颜色更改):

static void Main(string[] args)
        {
            IWebDriver driver = new FirefoxDriver();
            driver.Navigate().GoToUrl("https://experitest.com/selenium-testing");
            IWebElement element = driver.FindElement(By.Id("colorVar"));
            DefaultWait<IWebElement> wait = new DefaultWait<IWebElement>(element);
            wait.Timeout = TimeSpan.FromMinutes(2);
            wait.PollingInterval = TimeSpan.FromMilliseconds(250);

            Func<IWebElement, bool> waiter = new Func<IWebElement, bool>((IWebElement ele) =>
                {
                    String styleAttrib = element.GetAttribute("style");
                    if (styleAttrib.Contains("red"))
                    {
                        return true;
                    }
                    Console.WriteLine("Color is still " + styleAttrib);
                     return false;
                });
            wait.Until(waiter);
        }

您可以看到,此处 DefaultWait 未绑定到 WebDriver。你可以等待任何你喜欢的东西

希望这会有所帮助。 问候 尤金