Procházet zdrojové kódy

fix bug:修复自定义quit()释放不存在的远程selenium对象的错误:InvalidSessionIdException

dongzhaorui před 2 roky
rodič
revize
f7287b4491
1 změnil soubory, kde provedl 28 přidání a 27 odebrání
  1. 28 27
      FworkSpider/feapder/utils/webdriver.py

+ 28 - 27
FworkSpider/feapder/utils/webdriver.py

@@ -94,6 +94,8 @@ class WebDriver(RemoteWebDriver):
         # 设置10秒脚本超时时间
         self.driver.set_script_timeout(self._timeout)
 
+        self._is_remote = not self._usages_local_driver
+
     def __enter__(self):
         return self
 
@@ -104,6 +106,12 @@ class WebDriver(RemoteWebDriver):
         self.get_driver().quit()
         return False
 
+    def __getattr__(self, name):
+        if self.driver:
+            return getattr(self.driver, name)
+        else:
+            raise AttributeError
+
     def get_driver(self):
         return self.driver
 
@@ -112,6 +120,7 @@ class WebDriver(RemoteWebDriver):
         firefox_options = webdriver.FirefoxOptions()
         firefox_capabilities = webdriver.DesiredCapabilities.FIREFOX
         firefox_profile.set_preference("dom.webdriver.enabled", False)
+
         if self._proxy:
             proxy = self._proxy() if callable(self._proxy) else self._proxy
             proxy = proxy.replace("socks5://", "")
@@ -162,16 +171,14 @@ class WebDriver(RemoteWebDriver):
         return driver
 
     def remote_firefox_driver(self):
-        firefox_capabilities = {
-            "browserName": "firefox",
-            "platform": "ANY",
-            "version": self._version,
-            "javascriptEnabled": True,
-            "marionette": False,
-        }
         firefox_options = webdriver.FirefoxOptions()
+        desired_capabilities = firefox_options.to_capabilities()
         firefox_options.add_argument("--disable-gpu")
         firefox_options.set_preference("dom.webdriver.enabled", False)
+
+        if self._version:
+            desired_capabilities['version'] = self._version
+
         if self._proxy:
             proxy = self._proxy() if callable(self._proxy) else self._proxy
             proxy = proxy.replace("socks5://", "")
@@ -180,7 +187,6 @@ class WebDriver(RemoteWebDriver):
             firefox_options.set_preference('network.proxy.type', 1)  # 不使用代理:0, 使用代理:1
             firefox_options.set_preference('network.proxy.socks', ip)
             firefox_options.set_preference('network.proxy.socks_port', int(port))
-            # firefox_capabilities["marionette"] = True  # http代理的使用
 
         if self._user_agent:
             firefox_options.set_preference(
@@ -198,7 +204,7 @@ class WebDriver(RemoteWebDriver):
         executor = FirefoxRemoteConnection(remote_server_addr=self._server_addr)
         browser = webdriver.Remote(
             command_executor=executor,
-            desired_capabilities=firefox_capabilities,
+            desired_capabilities=desired_capabilities,
             options=firefox_options
         )
 
@@ -213,23 +219,21 @@ class WebDriver(RemoteWebDriver):
         return self.remote_firefox_driver()
 
     def remote_chrome_driver(self):
-        chrome_capabilities = {
-            "browserName": "chrome",
-            "platform": "ANY",
-            "version": self._version,
-            "javascriptEnabled": True,
-        }
         chrome_options = webdriver.ChromeOptions()
+        desired_capabilities = chrome_options.to_capabilities()
         # 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium
         chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
         chrome_options.add_experimental_option("useAutomationExtension", False)
         chrome_options.add_argument('--disable-blink-features=AutomationControlled')
         # docker 里运行需要
-        chrome_options.add_argument("--no-sandbox")
-        chrome_options.add_argument("--disable-gpu")
+        chrome_options.add_argument('--no-sandbox')
+        chrome_options.add_argument('--disable-gpu')
         chrome_options.add_argument('--disable-extensions')
         chrome_options.add_argument('--disable-dev-shm-usage')
 
+        if self._version:
+            desired_capabilities['version'] = self._version
+
         if self._proxy:
             chrome_options.add_argument(
                 "--proxy-server={}".format(
@@ -265,7 +269,7 @@ class WebDriver(RemoteWebDriver):
             command_executor=ChromeRemoteConnection(
                 remote_server_addr=self._server_addr,
                 keep_alive=True),
-            desired_capabilities=chrome_capabilities,
+            desired_capabilities=desired_capabilities,
             options=chrome_options
         )
 
@@ -276,7 +280,7 @@ class WebDriver(RemoteWebDriver):
                 'cmd': 'Page.addScriptToEvaluateOnNewDocument',
                 'params': {'source': js}
             }
-            res = browser.execute("executeCdpCommand", params)['value']
+            response = browser.execute("executeCdpCommand", params)['value']
         return browser
 
     def local_chrome_driver(self):
@@ -285,7 +289,6 @@ class WebDriver(RemoteWebDriver):
         chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
         chrome_options.add_experimental_option("useAutomationExtension", False)
         chrome_options.add_argument('--disable-blink-features=AutomationControlled')
-
         # docker 里运行需要
         chrome_options.add_argument("--no-sandbox")
         chrome_options.add_argument("--disable-gpu")
@@ -371,14 +374,12 @@ class WebDriver(RemoteWebDriver):
         for key, value in val.items():
             self.driver.add_cookie({"name": key, "value": value})
 
-    def __getattr__(self, name):
-        if self.driver:
-            return getattr(self.driver, name)
-        else:
-            raise AttributeError
-
     def quit(self):
-        self.get_driver().quit()
+        try:
+            self.get_driver().quit()
+        except Exception:
+            # We don't care about the message because something probably has gone wrong
+            pass
 
     # def __del__(self):
     #     if self.driver: