|
@@ -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:
|