在c#Selenium中,我使用FindElement查找页面中不存在的元素,但不是获取NoSuchElementException
我得到WebDriverException
例外是:
at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request)
at OpenQA.Selenium.Remote.HttpCommandExecutor.Execute(Command commandToExecute)
at OpenQA.Selenium.Firefox.FirefoxDriverCommandExecutor.Execute(Command commandToExecute)
at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(String mechanism, String value)
at org.myorg.DriverUtils.FindElement(By by, Boolean raiseException, Boolean setTestFail, Int32 currentAttempt)
网络驱动程序:
var downloadDir = "path to downoads";
var fxprofile = new FirefoxProfile();
fxprofile.SetPreference("browser.download.folderList", 2);
fxprofile.SetPreference("browser.download.dir", downloadDir);
fxprofile.SetPreference("browser.download.defaultFolder", downloadDir);
fxprofile.SetPreference("browser.download.useDownloadDir", true);
fxprofile.SetPreference("pdfjs.disabled", true);
var profileM = new FirefoxProfileManager();
var profile = profileM.GetProfile("fxprofile");
var options = new FirefoxOptions();
var firefoxBinary = "path to firefox exe";
Driver = new FirefoxDriver(firefoxBinary, fxprofile);
try{
Driver.FindElement(By.Id("non exeistant element"));
}
catch (NoSuchElementException e)
{
// not hit
}
catch (WebDriverException e)
{
//Hit here
// Another thing i noticed is it takes almost a minute to actually throw this exception from the FindElement
}
答案 0 :(得分:1)
我设法调试并找到根本原因。
最近,我使用了以下隐式等待进行故障排除,最终成为罪魁祸首
Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromMinutes(2));
但是当我创建FirefoxDriver
时,它使用默认命令超时1分钟初始化基类RemotewebDriver
public FirefoxDriver(FirefoxBinary binary, FirefoxProfile profile)
: this(binary, profile, RemoteWebDriver.DefaultCommandTimeout)
{
}
所以,基本上FirefoxCommandExecutor
已经在我配置的隐式等待之前完成,这使得驱动程序抛出WebdriverException
而不是NosuchElementexception
。我将隐含的等待恢复到20秒,问题就消失了。
我不确定这是FirefoxDriver
应该如何工作还是错误。当设置了imlicitwait时,Firefoxdriver
也许应该更新默认命令超时。
答案 1 :(得分:0)
webdriverException超时应该比隐式等待超时长。
因此可以到达NosuchElementexception
,
ImplicitlyWait(TimeSpan.FromSeconds(20))
就足够了。
请注意,NosuchElementException
继承自webdriverexception。