Skip to content

Commit eb8a1dc

Browse files
Merge branch 'botcity-dev:main' into ENH/binary_path
2 parents d51ed63 + 4074f66 commit eb8a1dc

File tree

9 files changed

+45
-11
lines changed

9 files changed

+45
-11
lines changed

.github/workflows/ci.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@ jobs:
3636
# * https://github.com/abhi1693/setup-browser/issues/8
3737
- os: windows-latest
3838
browser: "firefox"
39-
# Install wrong version in macOS.
40-
- os: macos-latest
41-
browser: "undetected_chrome"
4239

4340
steps:
4441
- uses: actions/checkout@v2

botcity/web/bot.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from botcity.base.utils import only_if_element
1919
from bs4 import BeautifulSoup
2020
from PIL import Image
21-
from selenium.common.exceptions import InvalidSessionIdException
21+
from selenium.common.exceptions import InvalidSessionIdException, WebDriverException
2222
from selenium.webdriver.common.action_chains import ActionChains
2323
from selenium.common.exceptions import StaleElementReferenceException
2424
from selenium.webdriver.common.by import By
@@ -280,10 +280,32 @@ def check_driver():
280280
self.capabilities = cap
281281
driver_path = self.driver_path or check_driver()
282282
self.driver_path = driver_path
283-
self._driver = driver_class(**self._get_parameters_to_driver())
283+
self._driver = self._instantiate_driver(driver_class=driver_class, func_def_options=func_def_options)
284284
self._others_configurations()
285285
self.set_screen_resolution()
286286

287+
def _instantiate_driver(self, driver_class, func_def_options):
288+
"""
289+
It is necessary to create this function because we isolated the instantiation of the driver,
290+
giving options to solve some bugs, mainly in undetected chrome.
291+
"""
292+
try:
293+
driver = driver_class(**self._get_parameters_to_driver())
294+
except WebDriverException as error:
295+
# TODO: 'Undetected Chrome' fix error to upgrade version chrome.
296+
if 'This version of ChromeDriver only supports Chrome version' in error.msg:
297+
self.stop_browser()
298+
try:
299+
correct_version = int(error.msg.split('Current browser version is ')[1].split('.')[0])
300+
except Exception:
301+
raise error
302+
self.options = func_def_options(self.headless, self._download_folder_path, None,
303+
self.page_load_strategy)
304+
driver = driver_class(**self._get_parameters_to_driver(), version_main=correct_version)
305+
else:
306+
raise error
307+
return driver
308+
287309
def _get_parameters_to_driver(self):
288310
if self.browser == Browser.UNDETECTED_CHROME:
289311
return {"options": self.options,
@@ -324,6 +346,8 @@ def stop_browser(self):
324346
"""
325347
if not self._driver:
326348
return
349+
if self.get_tabs():
350+
self.activate_tab(self.get_tabs()[-1])
327351
self._driver.close()
328352
self._driver.quit()
329353
self.options = None

botcity/web/browsers/edge.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def default_options(headless=False, download_folder_path=None, user_data_dir=Non
4747
edge_options.add_argument("--disable-syncdisable-translate")
4848
edge_options.add_argument("--metrics-recording-only")
4949
edge_options.add_argument("--safebrowsing-disable-auto-update")
50-
50+
edge_options.add_argument("--disable-features=msSmartScreenProtection")
5151
edge_options.add_argument("--disable-blink-features=AutomationControlled")
5252

5353
# Disable banner for Browser being remote-controlled

botcity/web/browsers/undetected_chrome.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import atexit
22
import json
33
import os
4+
import platform
45
import tempfile
56
from typing import Dict
67

@@ -66,7 +67,7 @@ def default_options(headless=False, download_folder_path=None, user_data_dir=Non
6667
# Check if user is root
6768
try:
6869
# This is only valid with Unix
69-
if os.geteuid() == 0:
70+
if os.geteuid() == 0 or platform.system() == 'Darwin':
7071
chrome_options.add_argument("--no-sandbox")
7172
except AttributeError:
7273
pass

conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ def download_driver(request):
117117
browser = request.config.getoption("--browser") or Browser.CHROME
118118
manager = factory_driver_manager(browser=browser)
119119
installed_driver = manager(path=folder_driver).install()
120+
120121
yield installed_driver
121122
# Issue: https://github.com/ultrafunkamsterdam/undetected-chromedriver/issues/551
122123
if platforms.get(platform.system()) == "windows" and browser == Browser.UNDETECTED_CHROME:

test-requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
pytest
22
pytest-xdist
3-
webdriver-manager
3+
webdriver-manager
4+
pytest-rerunfailures

tests/test_browser.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def test_display_size(web: WebBot):
4343
web.set_screen_resolution(1280, 720)
4444
(w, h) = web.display_size()
4545

46-
assert w in [1280, 1233, 1223, 1028, 1264]
46+
assert w in [1280, 1233, 1223, 1028, 1264, 1176]
4747

4848

4949
def test_javascript(web: WebBot):
@@ -214,7 +214,7 @@ def test_get_view_port_size(web: WebBot):
214214
element = [width, height]
215215
else:
216216
element = web.find_element('window-size', By.ID).text.split('x')
217-
sizes = [tuple(int(e) for e in element), (1600, 900)]
217+
sizes = [tuple(int(e) for e in element), (1600, 900), (1176, 802)]
218218
assert size in sizes
219219

220220

@@ -246,6 +246,7 @@ def test_set_screen_resolution(web: WebBot):
246246
assert width in ['500', '1600', '484']
247247

248248

249+
@pytest.mark.flaky(reruns=3)
249250
def test_wait_for_downloads(web: WebBot):
250251
fake_bin_path = conftest.get_fake_bin_path(web=web)
251252

@@ -258,6 +259,7 @@ def test_wait_for_downloads(web: WebBot):
258259
assert os.path.exists(fake_bin_path) and os.path.getsize(fake_bin_path) > 0
259260

260261

262+
@pytest.mark.flaky(reruns=3)
261263
def test_wait_for_file(web: WebBot):
262264
fake_bin_path = conftest.get_fake_bin_path(web=web)
263265

@@ -294,3 +296,9 @@ def test_print_pdf(web: WebBot, tmp_folder):
294296

295297
assert os.path.exists(pdf)
296298
os.remove(pdf)
299+
300+
301+
def test_disable_smart_screen(web: WebBot):
302+
web.browse('https://nav.smartscreen.msft.net/other/malware.html')
303+
h1 = web.find_element(by=By.XPATH, selector='/html/body/div/h1')
304+
assert h1.text.lower() == 'this is a demonstration malware website'

tests/test_mouse.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,8 @@ def test_get_element_coors(web: WebBot):
234234
web.click_at(x, y)
235235

236236
result = conftest.get_event_result('element-result', web)
237-
assert result['data'] == ['Left'] or result['data'] == ['Left2']
237+
results = [['Left2'], ['Left'], ['mouse-over']]
238+
assert result['data'] in results
238239

239240

240241
def test_get_element_coors_centered(web: WebBot):

tests/test_vision.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def test_get_last_element(web: WebBot):
4444
assert ele is not None
4545

4646

47+
@pytest.mark.flaky(reruns=3)
4748
def test_find_text(web: WebBot):
4849
web.browse(conftest.INDEX_PAGE)
4950
web.set_screen_resolution(3000, 2000)

0 commit comments

Comments
 (0)