2.2.1 Fixed issue where arguments were not passed along to chrome. Some small improvements for v2 headless, which is still detectable, but it's getting better....,

This commit is contained in:
UltrafunkAmsterdam 2021-03-25 10:23:32 +01:00
parent 853f299967
commit b3484a8b7e
2 changed files with 37 additions and 20 deletions

View File

@ -16,7 +16,7 @@ from setuptools import setup
setup( setup(
name="undetected-chromedriver", name="undetected-chromedriver",
version="2.2.0", version="2.2.1",
packages=["undetected_chromedriver"], packages=["undetected_chromedriver"],
install_requires=["selenium",], install_requires=["selenium",],
url="https://github.com/ultrafunkamsterdam/undetected-chromedriver", url="https://github.com/ultrafunkamsterdam/undetected-chromedriver",

View File

@ -170,7 +170,8 @@ class Chrome(object):
self.options = options self.options = options
self.user_data_dir = user_data_dir self.user_data_dir = user_data_dir
extra_args = [] extra_args = options.arguments
if options.headless: if options.headless:
extra_args.append("--headless") extra_args.append("--headless")
extra_args.append("--window-size=1920,1080") extra_args.append("--window-size=1920,1080")
@ -207,7 +208,10 @@ class Chrome(object):
orig_get = self.webdriver.get orig_get = self.webdriver.get
logger.info("setting properties for headless")
def get_wrapped(*args, **kwargs): def get_wrapped(*args, **kwargs):
if self.execute_script("return navigator.webdriver"): if self.execute_script("return navigator.webdriver"):
self.execute_cdp_cmd( self.execute_cdp_cmd(
"Page.addScriptToEvaluateOnNewDocument", "Page.addScriptToEvaluateOnNewDocument",
@ -224,10 +228,20 @@ class Chrome(object):
: target[key] : target[key]
}) })
}); });
Object.defineProperty(Notification, "permission", {
configurable: true,
enumerable: true,
get: () => {
return "unknown"
},
});
""" """
}, },
) )
logger.info("removing headless from user-agent string")
self.execute_cdp_cmd( self.execute_cdp_cmd(
"Network.setUserAgentOverride", "Network.setUserAgentOverride",
{ {
@ -236,9 +250,7 @@ class Chrome(object):
).replace("Headless", "") ).replace("Headless", "")
}, },
) )
return orig_get(*args, **kwargs) logger.info("fixing notifications permission in headless browsers")
self.webdriver.get = get_wrapped
if emulate_touch: if emulate_touch:
self.execute_cdp_cmd( self.execute_cdp_cmd(
@ -250,6 +262,9 @@ class Chrome(object):
})""" })"""
}, },
) )
return orig_get(*args, **kwargs)
self.webdriver.get = get_wrapped
def __getattribute__(self, attr): def __getattribute__(self, attr):
try: try:
@ -263,13 +278,11 @@ class Chrome(object):
def __dir__(self): def __dir__(self):
return object.__dir__(self) + object.__dir__(self.webdriver) return object.__dir__(self) + object.__dir__(self.webdriver)
def start_session(self, capabilities=None, browser_profile=None): def start_session(self, capabilities=None, browser_profile=None):
if not capabilities: if not capabilities:
capabilities = self.options.to_capabilities() capabilities = self.options.to_capabilities()
self.webdriver.start_session(capabilities, browser_profile) self.webdriver.start_session(capabilities, browser_profile)
def get_in(self, url: str, delay=2, factor=1): def get_in(self, url: str, delay=2, factor=1):
""" """
:param url: str :param url: str
@ -310,7 +323,13 @@ class Chrome(object):
self.start_session() self.start_session()
def quit(self): def quit(self):
logger.debug("closing webdriver")
try: try:
self.webdriver.quit()
except Exception: # noqa
pass
try:
logger.debug("killing browser")
self.browser.kill() self.browser.kill()
self.browser.wait(1) self.browser.wait(1)
except TimeoutError as e: except TimeoutError as e:
@ -318,12 +337,10 @@ class Chrome(object):
except Exception: # noqa except Exception: # noqa
pass pass
try: try:
self.webdriver.quit() logger.debug("removing profile : %s" % self.user_data_dir)
except Exception: # noqa
pass
try:
shutil.rmtree(self.user_data_dir, ignore_errors=False) shutil.rmtree(self.user_data_dir, ignore_errors=False)
except PermissionError: except PermissionError:
logger.debug("permission error. files are still in use/locked. retying...")
time.sleep(1) time.sleep(1)
self.quit() self.quit()