c#selenium:找不到元素时获取WebdriverException

时间:2017-08-08 20:54:17

标签: c# selenium firefox selenium-webdriver webdriver

在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
}

2 个答案:

答案 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。