提问人:KarkMump 提问时间:5/9/2019 最后编辑:C. PeckKarkMump 更新时间:5/9/2019 访问量:503
将 Selenium 与 Chrome 版本 74 配合使用:发生意外的 NoSuchElementException
Using Selenium with Chrome version 74: unexpected NoSuchElementException occurs
问:
我正在尝试将 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 版本?我是否将驱动程序放在错误的文件夹中?
答:
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。你可以等待任何你喜欢的东西
希望这会有所帮助。 问候 尤金
评论
.FindElement(By.XPath("//*[@id='username']"))