Skip to content

Commit 0fc7aec

Browse files
authored
Merge pull request #69 from botcity-dev/TST/tests-to-browsers
TST: Test to browsers implements in CI
2 parents 7c50ab2 + c1b6e1f commit 0fc7aec

File tree

19 files changed

+437
-8
lines changed

19 files changed

+437
-8
lines changed

.flake8

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ exclude =
66
dist,
77
versioneer.py,
88
botcity/maestro/_version.py,
9-
docs/source/conf.py
9+
docs/source/conf.py,
10+
tests
1011
max-line-length = 115

.github/workflows/ci.yml

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ on:
44
push:
55
pull_request:
66

7+
concurrency:
8+
group: ${{ github.workflow }}-${{ github.ref }}
9+
cancel-in-progress: true
10+
11+
env:
12+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
13+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
14+
715
jobs:
816
build:
917
runs-on: ${{ matrix.os }}
@@ -13,9 +21,17 @@ jobs:
1321
strategy:
1422
matrix:
1523
os: [ubuntu-latest]
16-
python-version: [3.7]
24+
python-version: ["3.10"]
25+
browser: [firefox, chrome, edge]
26+
headless: [true]
27+
1728
steps:
1829
- uses: actions/checkout@v2
30+
- name: Install libgl1
31+
run: |
32+
sudo dpkg --add-architecture i386
33+
sudo apt update
34+
sudo apt install libgl1-mesa-dev libgconf-2-4 libatk1.0-0 libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm-dev libnss3-dev libxss-dev libasound2 -y
1935
2036
- name: Set up Python ${{ matrix.python-version }}
2137
uses: actions/setup-python@v2
@@ -30,6 +46,17 @@ jobs:
3046
run: |
3147
pip install .
3248
33-
- name: Run Tests
49+
- uses: browser-actions/setup-chrome@latest
50+
if: ${{ matrix.browser }} == "chrome"
51+
with:
52+
chrome-version: stable
53+
54+
- uses: browser-actions/setup-firefox@latest
55+
if: ${{ matrix.browser }} == "firefox"
56+
57+
- uses: browser-actions/setup-edge@latest
58+
if: ${{ matrix.browser }} == "edge"
59+
60+
- name: Run Tests in ${{ matrix.browser }}
3461
run: |
35-
python run_tests.py
62+
pytest -v -vrxs --headless=${{ matrix.headless }} --browser=${{ matrix.browser }}

botcity/web/browsers/edge.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,13 @@
1414
def default_options(headless=False, download_folder_path=None, user_data_dir=None,
1515
page_load_strategy="normal") -> EdgeOptions:
1616
"""Retrieve the default options for this browser curated by BotCity.
17-
1817
Args:
1918
headless (bool, optional): Whether or not to use the headless mode. Defaults to False.
2019
download_folder_path (str, optional): The default path in which to save files.
2120
If None, the current directory is used. Defaults to None.
2221
user_data_dir ([type], optional): The directory to use as user profile.
2322
If None, a new temporary directory is used. Defaults to None.
2423
page_load_strategy (str, optional): The page load strategy. Defaults to "normal".
25-
2624
Returns:
2725
EdgeOptions: The Edge options.
2826
"""
@@ -119,7 +117,6 @@ def default_options(headless=False, download_folder_path=None, user_data_dir=Non
119117

120118
def default_capabilities() -> Dict:
121119
"""Fetch the default capabilities for this browser.
122-
123120
Returns:
124121
Dict: Dictionary with the default capabilities defined.
125122
"""

conftest.py

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import os
2+
import json
3+
import shutil
4+
import tempfile
5+
6+
import pytest
7+
import typing
8+
import platform
9+
10+
from botcity.web import WebBot, Browser, By, browsers
11+
from webdriver_manager.chrome import ChromeDriverManager
12+
from webdriver_manager.firefox import GeckoDriverManager
13+
from webdriver_manager.microsoft import EdgeChromiumDriverManager
14+
15+
OS_NAME = platform.system()
16+
17+
PROJECT_DIR = os.path.abspath('tests')
18+
TEST_PAGE = "https://lf2a.github.io/webpage-test/test.html"
19+
INDEX_PAGE = "https://lf2a.github.io/webpage-test/"
20+
21+
22+
def get_fake_bin_path(web: WebBot) -> str:
23+
return os.path.join(web.download_folder_path, 'fake.bin')
24+
25+
26+
def setup_chrome(headless: bool, tmp_folder: str, download_driver: str) -> WebBot:
27+
web = WebBot(headless)
28+
web.browser = Browser.CHROME
29+
30+
web.driver_path = download_driver
31+
web.download_folder_path = tmp_folder
32+
return web
33+
34+
35+
def setup_firefox(headless: bool, tmp_folder: str, download_driver: str) -> WebBot:
36+
web = WebBot(headless)
37+
web.browser = Browser.FIREFOX
38+
39+
web.driver_path = download_driver
40+
web.download_folder_path = tmp_folder
41+
42+
return web
43+
44+
45+
def setup_edge(headless: bool, tmp_folder: str, download_driver: str) -> WebBot:
46+
web = WebBot(headless)
47+
web.browser = Browser.EDGE
48+
49+
web.driver_path = download_driver
50+
web.download_folder_path = tmp_folder
51+
opt = browsers.edge.default_options(headless=headless, download_folder_path=tmp_folder)
52+
opt.set_capability('platform', 'ANY')
53+
54+
web.options = opt
55+
return web
56+
57+
58+
def factory_setup_browser(browser: str, is_headless: bool, tmp_folder: str, download_driver: str) -> WebBot:
59+
dict_browsers = {
60+
'chrome': setup_chrome,
61+
'firefox': setup_firefox,
62+
'edge': setup_edge
63+
}
64+
65+
setup_browser = dict_browsers.get(browser, None)
66+
67+
if setup_browser is None:
68+
raise ValueError(f'Browser [{browser}] not supported.')
69+
70+
return setup_browser(headless=is_headless, tmp_folder=tmp_folder, download_driver=download_driver)
71+
72+
73+
def factory_driver_manager(browser: str):
74+
dict_driver_manager = {
75+
'chrome': ChromeDriverManager,
76+
'firefox': GeckoDriverManager,
77+
'edge': EdgeChromiumDriverManager
78+
}
79+
80+
driver_manager = dict_driver_manager.get(browser, None)
81+
82+
if dict_driver_manager is None:
83+
raise ValueError(f'Driver to [{browser}] not supported.')
84+
85+
return driver_manager
86+
87+
88+
@pytest.fixture
89+
def tmp_folder() -> str:
90+
folder = tempfile.mkdtemp()
91+
yield folder
92+
shutil.rmtree(folder)
93+
94+
95+
@pytest.fixture(autouse=True, scope="session")
96+
def download_driver(request):
97+
folder_driver = tempfile.mkdtemp()
98+
browser = request.config.getoption("--browser") or Browser.CHROME
99+
manager = factory_driver_manager(browser=browser)
100+
installed_driver = manager(path=folder_driver).install()
101+
yield installed_driver
102+
shutil.rmtree(folder_driver)
103+
104+
105+
@pytest.fixture
106+
def web(request, tmp_folder: str, download_driver: str):
107+
browser = request.config.getoption("--browser") or Browser.CHROME
108+
is_headless = request.config.getoption("--headless") or "false"
109+
is_headless = True if is_headless.lower() == "true" else False
110+
web = factory_setup_browser(browser=browser, is_headless=is_headless, tmp_folder=tmp_folder,
111+
download_driver=download_driver)
112+
yield web
113+
web.stop_browser()
114+
115+
116+
def get_event_result(id_event: str, web: WebBot) -> typing.Dict:
117+
event_result = web.find_element(id_event, By.ID)
118+
return json.loads(event_result.text)
119+
120+
121+
def pytest_addoption(parser):
122+
parser.addoption('--headless', action='store', default="true")
123+
parser.addoption('--browser', action='store', default='chrome')
124+

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ msedge-selenium-tools==3.141.3
44
numpy
55
opencv-python
66
pillow
7-
selenium==3.141
7+
selenium==3.141

test-requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
pytest
2+
pytest-xdist
3+
webdriver-manager

tests/__init__.py

Whitespace-only changes.

tests/resources/git.png

2.03 KB
Loading

tests/resources/hello_world.png

4.93 KB
Loading

tests/resources/mario3.png

4.65 KB
Loading

0 commit comments

Comments
 (0)