Selenium GeckoDriver和Mozilla出现“未初始化组件” nsresult:“ 0xc1f30001(NS_ERROR_NOT_INITIALIZED)”错误

时间:2019-09-16 05:06:19

标签: selenium mozilla geckodriver webdriverwait selenium-firefoxdriver

我正在尝试在Firefox中执行我的代码,有时它可以工作,但大多数情况下我会出现以下异常:

[Exception... "Component not initialized"  nsresult: "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)"  location: "JS frame :: chrome://marionette/content/dom.js :: addEventListener :: line 67"  data: no]

它从上周开始发生,以前对我来说还不错。

3 个答案:

答案 0 :(得分:0)

您似乎正在遭受Geckodriver Issue 1263的困扰,可以尝试以下解决方法:

  1. 将Selenium客户端库更新到3.141.59的最新稳定版本,最好使用MavenGradle之类的软件包管理系统,因为可能会更新依赖库需要。如果您不使用Java,请查看Web - Desktop and Mobile Browsers文章,以获取不同Selenium客户端语言(例如JavaScript,Python,C#等)的代码示例。

  2. 确保使用最新版本的Firefox

  3. 确保使用最新版本的Geckodriver

如果您仍然遇到问题,可以考虑在Geckodriver项目中提出一个new issue,并准备提供尽可能多的信息(如果有其他问题,此处同样适用)

答案 1 :(得分:0)

NS_ERROR_NOT_INITIALIZED类似于尝试使用尚未初始化的组件或对象。这些组件通常提供一种初始化方法,通常称为Init,必须在使用任何其他方法之前调用它们。

但是,此错误消息...

[Exception... "Component not initialized"  nsresult: "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)"  location: "JS frame :: chrome://marionette/content/dom.js :: addEventListener :: line 67"  data: no]

...表示牵线木偶在调用 addEventListener 中定义的dom.js时抛出错误

您的代码试用和相关的HTML DOM本可以帮助我们以更好的方式调试问题。然而,似乎addEventListener甚至在DOM Tree完全呈现之前就被调用为时过早。更具体地说,甚至在 Browser Client (即Web浏览器)达到等于addEventListener的{​​{1}}之前调用'document.readyState'。通常,一旦满足此条件,Selenium将执行下一行代码。


解决方案

一种快速的解决方案是,在尝试与新加载的网页上的任何元素进行交互之前,您需要为以下expected_conditions中的任何一个诱导 WebDriverWait

一个例子

  • Python

    • 代码块:

      "complete"
    • 控制台输出:

      driver.get("https://stackoverflow.com");
      WebDriverWait(driver, 10).until(EC.title_contains("Stack"))
      print("Page Title is : "+driver.title)
      
  • Java

    • 代码块:

      Page Title is : Stack Overflow - Where Developers Learn, Share, & Build Careers 
      
    • 控制台输出:

      driver.get("https://stackoverflow.com");
      new WebDriverWait(driver, 10).until(ExpectedConditions.titleContains("Stack"));
      System.out.println("Page Title is : "+driver.getTitle());
      

其他注意事项

  

您可以在Which Firefox browser versions supported for given Geckodriver version?

中找到详细的讨论
  • GeckoDriver存在于所需位置。
  • GeckoDriver对非root用户具有可执行权限。
  • Firefox 版本升级到 Firefox v69.0 级别。
  • 通过您的 IDE
  • 清理您的项目工作区重建您的项目,并且仅具有必需的依赖项。
  • 如果您的基本 Web客户端版本太旧,则将其卸载并安装最新版本的 Web客户端 GA。
  • 进行系统重启
  • 以非root用户身份执行Page Title is : Stack Overflow - Where Developers Learn, Share, & Build Careers
  • 始终在Test方法内调用driver.quit(),以优雅地关闭和销毁 WebDriver Web Client 实例。

Outro

您可以在以下位置找到一些相关的讨论

答案 2 :(得分:0)

就我而言,某些配置是错误的。我试图阻止弹出式下载,但出了点问题。这是我必须删除的代码,并且可以工作(在这种情况下):

FirefoxProfile profile = new FirefoxProfile();

profile.setPreference("browser.download.dir", "C:\\Temp");
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "text/csv");
profile.setPreference("pdfjs.disabled", true);
profile.setPreference("browser.download.folderList", 2);
profile.setPreference("browser.download.panel.shown", false);

DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability(FirefoxDriver.PROFILE, profile);
capabilities.setCapability(CapabilityType.ELEMENT_SCROLL_BEHAVIOR, 1);

driver = new FirefoxDriver(capabilities);