当前位置: 首页 > 知识库问答 >
问题:

firefox selenium测试完成时出现“无此类文件或目录”错误消息

锺星腾
2023-03-14

在使用geckodriver(firefox)运行PythonSelenium测试后,会出现一条标准输出错误消息,但在使用chrome时不会出现。我不知道错误线是从哪里来的。它发生在调用sys之后。exit(),所以在清理过程中的某个地方。

[Errno 2] No such file or directory: '/var/folders/ml/tbnznl592397p4h1svx4t5xr0000gr/T/tmpr8ypd0y1'
  • MacOS 10.14.5(莫哈韦)
  • 驱动程序信息:firefox=67.0
  • 会话信息:firefox=0.24.0
  • 硒3.141.0
  • Python 3.7.3

下面是火狐和chrome的驱动程序初始化。

    def createDriver(self, browser: str, headless: bool = False, performancelog=False, 
                     consolelog=False, verbose: bool = False):

        ## DRIVERS
        #chrome
        # https://chromedriver.storage.googleapis.com/index.html

        #firefox
        # https://github.com/mozilla/geckodriver/releases
        # 20.1 has a bug where headless doesn't work
        # 19 has a bug where it closes a frame?

        # safari

        # edge
        # https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
        logger.trace("createDriver()")
        if browser.upper() == 'FIREFOX':
            ## setting log_path to /dev/null will prevent geckodriver from creating it's own log file.
            ## if we enable root logging, we can capture the logging from geckodriver, ourselves.
            options = webdriver.FirefoxOptions()
            profile = webdriver.FirefoxProfile()

            profile.set_preference('app.update.auto', False)
            profile.set_preference('app.update.enabled', False)

            # options.binary_location = binary ## use this only if we want to move the executable outside the available path
            if headless:
                options.headless = True

            caps = DesiredCapabilities.FIREFOX
            caps['unhandledPromptBehavior'] = "ignore"
            driver = webdriver.Firefox(profile, log_path='/dev/null', firefox_options=options, 
                                       desired_capabilities=caps
                                       )
            logger.debug(f"Driver info: firefox={driver.capabilities['browserVersion']}")
            logger.debug(f"Session info: firefox={driver.capabilities['moz:geckodriverVersion']}")

            if driver.capabilities['moz:geckodriverVersion'] == '0.20.1':
                if headless:
                    raise Exception("Headless mode doesn't work in Gecko Driver 0.20.1")

        elif browser.upper() == 'CHROME':
            options = webdriver.ChromeOptions()
            options.add_argument("--disable-extensions")
            options.add_argument("--allow-running-insecure-content")
            options.add_argument("--ignore-certificate-errors")
            options.add_argument("--disable-single-click-autofill")
            options.add_argument("--disable-autofill-keyboard-accessory-view[8]")
            options.add_argument("--disable-full-form-autofill-ios")
            options.add_argument("--dns-prefetch-disable") # https://bugs.chromium.org/p/chromedriver/issues/detail?id=402#c128

            ## ChromeDriver is just AWFUL because every version or two it breaks unless you pass cryptic arguments
            options.add_argument("start-maximized") # https://stackoverflow.com/a/26283818/1689770
            options.add_argument("enable-automation") # https://stackoverflow.com/a/43840128/1689770
            options.add_argument("--no-sandbox") # https://stackoverflow.com/a/50725918/1689770
            options.add_argument("--disable-infobars") # https://stackoverflow.com/a/43840128/1689770
            options.add_argument("--disable-dev-shm-usage") # https://stackoverflow.com/a/50725918/1689770
            options.add_argument("--disable-browser-side-navigation") # https://stackoverflow.com/a/49123152/1689770
            options.add_argument("--disable-gpu") # https://stackoverflow.com/questions/51959986/how-to-solve-selenium-chromedriver-timed-out-receiving-message-from-renderer-exc
            # options.add_argument("--window-size=1280,960")
            options.add_argument("--enable-features=NetworkService,NetworkServiceInProcess") # https://groups.google.com/forum/m/#!topic/chromedriver-users/ktp-s_0M5NM[21-40]

            if headless:
                options.headless = True
                # options.add_argument('--disable-gpu')

            args = [
                "--verbose"
                ]

            caps = DesiredCapabilities.CHROME
            caps['loggingPrefs'] = {
                'browser': 'OFF',
                'performance' : 'OFF',
                'driver' : 'OFF'
                }
            # https://www.skptricks.com/2018/08/timed-out-receiving-message-from-renderer-selenium.html
            # caps['pageLoadStrategy'] = 'none'
            # caps['pageLoadStrategy'] = 'normal'

            if consolelog:
                caps['loggingPrefs']['browser'] = 'ALL'

            ## by default performance is disabled.
            if performancelog:
                caps['loggingPrefs']['performance'] = 'ALL'
                caps['perfLoggingPrefs'] = {
                    'enableNetwork' : True,
                    'enablePage' : False,
                    'enableTimeline' : False
                    }

            if verbose:
                driver = webdriver.Chrome(options=options, service_log_path='chromedriver.log', service_args=args, 
                                          desired_capabilities=caps
                                          )
            else:
                driver = webdriver.Chrome(options=options, 
                                          # service_log_path='chromedriver.log',
                                          desired_capabilities=caps
                                          )
            logger.debug(f"Driver info: chrome={driver.capabilities['chrome']['chromedriverVersion']}")
            logger.debug(f"Session info: chromedriver={driver.capabilities['version']}")

        elif browser.upper() == 'EDGE':
            # driver = webdriver.Edge()
            raise NotImplemented("Edge not supported yet")

        elif browser.upper() == 'SAFARI':
            # driver = webdriver.Safari()
            raise NotImplemented("Safari not supported yet")

        # support is depricated for this -- should use chrome or firefox headless. 
        elif browser.upper() == 'PHANTOMJS':
            # driver = webdriver.PhantomJS()
            raise NotImplemented("PhantomJS not supported yet")
        else:
            raise ValueError(f"Unknown browser: {browser}")

        # driver.set_page_load_timeout(self.timeout)
        # driver.set_script_timeout(self.timeout)
        return driver

在这两种情况下,我都会让驱动程序坐在一个包装器中,处理自动退出驱动程序的问题。

    ############################################################################
    def close(self):
        if self.driver is not None:
            self.driver.close()

    ############################################################################
    def quit(self):
        if self.driver is not None:
            self.driver.quit()

    ############################################################################
    def __del__(self):
        self.quit()

在退出脚本之前调用close或quit不会触发让我感到困惑的错误消息。我原以为错误消息是垃圾收集时geckodriver中的某个东西,但如果是这样的话,我想我可以通过在sys之前关闭驱动程序来手动触发错误。退出()。

有人知道火狐硒运行后这个错误信息来自哪里吗?

编辑:出现问题的文件夹似乎是FirefoxProfile创建的临时目录。我觉得firefox。网络驱动程序。quit()方法是日志行的来源。

    def quit(self):
        """Quits the driver and close every associated window."""
        try:
            RemoteWebDriver.quit(self)
        except Exception:
            # We don't care about the message because something probably has gone wrong
            pass

        if self.w3c:
            self.service.stop()
        else:
            self.binary.kill()

        if self.profile is not None:
            try:
                shutil.rmtree(self.profile.path)
                if self.profile.tempfolder is not None:
                    shutil.rmtree(self.profile.tempfolder)
            except Exception as e:
                print(str(e)) #<-- this is the line where the error occurs.

共有1个答案

祁霖
2023-03-14

嘎!我完全忘记了我在Firefox的web驱动程序中添加了一个__del__方法。(

# hack to force firefox to quit when closing scope
def __del_replacement__(self: webdriver.Firefox):
    print("__del__ called in Firefox")
    self.quit()
webdriver.Firefox.__del__ = __del_replacement__

问题是还有一个__del__方法在包装中围绕着web驱动程序,它试图调用driver.quit()。这个问题是由两个调用试图删除临时目录的方法引起的。第二个失败了,因为它已经被移除了。

 类似资料:
  • 问题内容: 我在Ubuntu 9.10 x86_64上安装了二进制Linux应用程序。该应用程序附带了旧版本的gzip(1.2.4),该版本已针对较旧的内核进行了编译: 我无法执行该程序。如果我尝试过,就会发生这种情况: ldd同样对此二进制文件不满意: 我很好奇:此问题最可能的根源是什么?文件损坏了吗?还是由于为较旧的{kernel,libc,…}构建而导致二进制不兼容? Per nos的建议,

  • 问题内容: 我正在尝试将数据加载到我的MySQL数据库的表中,并得到此错误。 参考:此 路径是正确的百分率,我通过按shift键并单击“将路径复制为”将其复制并进行了多次检查。 因此,对此的任何提示将不胜感激 。 其次, 这里有没有办法使用某种相对路径(而不是绝对路径)? 问题答案: 我不知道您使用的是哪个版本的MySQL,但通过Google的快速搜索找到了您对这两个问题的可能答案。以下是《MyS

  • 问题内容: 我正在对GitHub上的此示例Angular2应用进行较小的修改,以使其使用Express.js而不是KOA。但是目前,当我尝试在FireFox中加载应用程序时,控制台中会显示以下错误: 当http请求触发路由器处理程序并返回时,Angular2应用程序开始加载,该处理程序返回,然后触发一系列嵌套依赖项的回调,其中一个引发错误并中途停止应用程序加载。 为了解决GitHub示例中的代码需

  • 当我添加docker GPG密钥时设置docker存储库 cmd-curl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|sudo apt-key add- 获取错误(gpg:无法打开“-”:没有这样的文件或目录)

  • 问题内容: 构建docker时出现错误。 这是我的Dockerfile。 我运行一个命令: 你有什么想法吗? 问题答案: 这是因为您没有发布解决方案。 错误消息是不言自明的: 默认情况下,当您向ASP.NET Core Visual Studio 2017项目添加 Docker支持 时,它将创建一堆文件,其中一个文件用于处理构建过程。然后,当您通过Visual Studio生成项目时,将执行完整的

  • 我正在使用mysql/mysql-server映像在docker中创建一个mysql服务器。因为我想自动设置我的数据库(添加用户、创建表),所以我创建了一个SQL文件来完成这个任务。为了自动运行该脚本,我使用这个dockerfile扩展了映像: 但出于某种原因,这种情况会发生: 如何修复此问题?