Skip to content

Commit 441a896

Browse files
authored
Merge pull request #112 from botcity-dev/fix/delete-temp-folder
FIX: Ensuring the temp folder is deleted at the end
2 parents f41e1bb + cf8e112 commit 441a896

File tree

7 files changed

+68
-28
lines changed

7 files changed

+68
-28
lines changed

.github/workflows/ci.yml

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ jobs:
2727
browser: ["firefox", "chrome", "edge"]
2828
headless: [true]
2929
exclude:
30-
# Can't install firefox using setup-firefox on Windows
30+
# For now, the edge setup on linux amd64 is not working (07/2024)
3131
# See the issues below
32-
# * https://github.com/browser-actions/setup-firefox/issues/252
33-
# * https://github.com/abhi1693/setup-browser/issues/8
34-
- os: windows-latest
35-
browser: "firefox"
32+
# * https://github.com/browser-actions/setup-edge/issues/386
33+
# * https://github.com/browser-actions/setup-edge/issues/516
34+
- os: ubuntu-latest
35+
browser: "edge"
36+
- os: macos-latest
37+
browser: "edge"
3638
steps:
3739
- uses: actions/checkout@v4
3840
- name: Install libgl1
@@ -67,5 +69,11 @@ jobs:
6769
if: matrix.browser == 'edge'
6870

6971
- name: Run Tests in ${{ matrix.browser }}
72+
if: matrix.browser == 'chrome' || matrix.browser == 'firefox'
7073
run: |
7174
pytest -n 2 -v -vrxs --headless=${{ matrix.headless }} --browser=${{ matrix.browser }}
75+
76+
- name: Run Tests in ${{ matrix.browser }}
77+
if: matrix.browser == 'edge'
78+
run: |
79+
pytest -v -vrxs --headless=${{ matrix.headless }} --browser=${{ matrix.browser }}

botcity/web/bot.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from selenium.webdriver.remote.webelement import WebElement
2929
from selenium.webdriver.support.wait import WebDriverWait, TimeoutException, NoSuchElementException
3030
from selenium.webdriver.support import expected_conditions as EC
31-
from weakref import ReferenceType, ref
31+
from weakref import ref
3232

3333
from . import config, cv2find
3434
from .browsers import BROWSER_CONFIGS, Browser, PageLoadStrategy
@@ -43,13 +43,16 @@
4343
logger = logging.getLogger(__name__)
4444

4545

46-
def _cleanup(bot: ReferenceType[WebBot]):
47-
if bot() is not None:
46+
def _cleanup(driver, temp_dir):
47+
if driver() is not None:
48+
try:
49+
if driver().service.is_connectable():
50+
driver().quit()
51+
except Exception:
52+
pass
53+
54+
if temp_dir:
4855
try:
49-
bot().stop_browser()
50-
temp_dir = bot()._botcity_temp_dir
51-
if not temp_dir:
52-
return None
5356
shutil.rmtree(temp_dir, ignore_errors=True)
5457
except Exception:
5558
pass
@@ -94,8 +97,6 @@ def __init__(self, headless=False):
9497
self._download_folder_path = os.getcwd()
9598
self._botcity_temp_dir = None
9699

97-
atexit.register(_cleanup, ref(self))
98-
99100
def __enter__(self):
100101
pass
101102

@@ -279,10 +280,11 @@ def check_driver():
279280
self.capabilities = cap
280281
driver_path = self.driver_path or check_driver()
281282
self.driver_path = driver_path
282-
283283
self._driver = driver_class(options=opt, desired_capabilities=cap, executable_path=driver_path)
284284
self.set_screen_resolution()
285285

286+
atexit.register(_cleanup, ref(self._driver), self.options._botcity_temp_dir)
287+
286288
def stop_browser(self):
287289
"""
288290
Stops the Chrome browser and clean up the User Data Directory.

conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ def web(request, tmp_folder: str, download_driver: str):
116116

117117

118118
def get_event_result(id_event: str, web: WebBot) -> typing.Dict:
119+
web.wait(1000)
119120
event_result = web.find_element(id_event, By.ID)
120121
return json.loads(event_result.text)
121122

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: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
import pytest
33
import conftest
44

5-
from PIL import Image
5+
from PIL import Image, ImageFile
66
from botcity.web import WebBot, By
7+
from pytest import xfail
78

89

910
def test_context(web: WebBot):
@@ -41,7 +42,7 @@ def test_display_size(web: WebBot):
4142
web.set_screen_resolution(1280, 720)
4243
(w, h) = web.display_size()
4344

44-
assert w in [1280, 1264, 1223]
45+
assert w in [1280, 1264, 1223, 1256]
4546

4647

4748
def test_javascript(web: WebBot):
@@ -90,7 +91,7 @@ def test_get_image_from_map(web: WebBot):
9091
web.add_image('mouse', os.path.join(conftest.PROJECT_DIR, 'resources', 'mouse.png'))
9192
img = web.get_image_from_map('mouse')
9293

93-
assert Image.isImageType(img)
94+
assert isinstance(img, ImageFile.ImageFile)
9495

9596

9697
def test_get_js_dialog(web: WebBot):
@@ -117,15 +118,15 @@ def test_get_screen_image(web: WebBot):
117118
web.browse(conftest.INDEX_PAGE)
118119
img = web.get_screen_image(region=(0, 0, 400, 200))
119120

120-
assert Image.isImageType(img)
121+
assert isinstance(img, Image.Image)
121122

122123

123124
def test_get_screenshot(web: WebBot):
124125
web.browse(conftest.INDEX_PAGE)
125126
fp = os.path.join(conftest.PROJECT_DIR, 'resources', 'screenshot_test.png')
126127
img = web.get_screenshot(fp)
127128

128-
assert Image.isImageType(img) and os.path.isfile(fp)
129+
assert isinstance(img, Image.Image) and os.path.isfile(fp)
129130
os.remove(fp)
130131

131132

@@ -135,7 +136,7 @@ def test_screen_cut(web: WebBot):
135136
img = web.screen_cut(0, 0, 100, 200)
136137
img.save(fp)
137138

138-
assert Image.isImageType(img) and os.path.isfile(fp)
139+
assert isinstance(img, Image.Image) and os.path.isfile(fp)
139140
os.remove(fp)
140141

141142

@@ -232,10 +233,13 @@ def test_set_screen_resolution(web: WebBot):
232233

233234
page_size = web.find_element('page-size', By.ID).text
234235
width = page_size.split('x')[0]
235-
assert width == '500'
236+
assert width in ['500', '476']
236237

237238

238239
def test_wait_for_downloads(web: WebBot):
240+
if web.browser.lower() in 'edge' and os.getenv('CI') is not None:
241+
xfail(reason=f"Edge is not working properly for some tests in CI")
242+
239243
fake_bin_path = conftest.get_fake_bin_path(web=web)
240244

241245
web.browse(conftest.INDEX_PAGE)
@@ -248,6 +252,9 @@ def test_wait_for_downloads(web: WebBot):
248252

249253

250254
def test_wait_for_file(web: WebBot):
255+
if web.browser.lower() in 'edge' and os.getenv('CI') is not None:
256+
xfail(reason=f"Edge is not working properly for some tests in CI")
257+
251258
fake_bin_path = conftest.get_fake_bin_path(web=web)
252259

253260
web.browse(conftest.INDEX_PAGE)

tests/test_keyboard.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import conftest
22

3+
import pytest
4+
35
from botcity.web import WebBot
46

57

8+
@pytest.mark.flaky(reruns=3)
69
def test_control_a(web: WebBot):
710
web.browse(conftest.INDEX_PAGE)
811
web.control_a()
@@ -14,13 +17,15 @@ def test_control_a(web: WebBot):
1417
assert result['data'] == ['Control', 'a']
1518

1619

20+
@pytest.mark.flaky(reruns=3)
1721
def test_control_c(web: WebBot):
1822
web.browse(conftest.INDEX_PAGE)
1923
web.control_c()
2024

2125
assert web.get_clipboard() == 'Botcity'
2226

2327

28+
@pytest.mark.flaky(reruns=3)
2429
def test_enter(web: WebBot):
2530
web.browse(conftest.INDEX_PAGE)
2631
web.enter()
@@ -29,6 +34,7 @@ def test_enter(web: WebBot):
2934
assert result['data'] == ['Enter']
3035

3136

37+
@pytest.mark.flaky(reruns=3)
3238
def test_control_v(web: WebBot):
3339
web.browse(conftest.INDEX_PAGE)
3440
web.copy_to_clipboard(text='botcity-paste')
@@ -38,6 +44,7 @@ def test_control_v(web: WebBot):
3844
assert ''.join(result['data']) == 'botcity-paste'
3945

4046

47+
@pytest.mark.flaky(reruns=3)
4148
def test_delete(web: WebBot):
4249
web.browse(conftest.INDEX_PAGE)
4350
web.delete()
@@ -46,6 +53,7 @@ def test_delete(web: WebBot):
4653
assert result['data'] == ['Delete']
4754

4855

56+
@pytest.mark.flaky(reruns=3)
4957
def test_key_end(web: WebBot):
5058
web.browse(conftest.INDEX_PAGE)
5159
web.key_end()
@@ -54,6 +62,7 @@ def test_key_end(web: WebBot):
5462
assert result['data'] == ['End']
5563

5664

65+
@pytest.mark.flaky(reruns=3)
5766
def test_key_esc(web: WebBot):
5867
web.browse(conftest.INDEX_PAGE)
5968
web.key_esc()
@@ -62,6 +71,7 @@ def test_key_esc(web: WebBot):
6271
assert result['data'] == ['Escape']
6372

6473

74+
@pytest.mark.flaky(reruns=3)
6575
def test_key_home(web: WebBot):
6676
web.browse(conftest.INDEX_PAGE)
6777
web.key_home()
@@ -70,6 +80,7 @@ def test_key_home(web: WebBot):
7080
assert result['data'] == ['Home']
7181

7282

83+
@pytest.mark.flaky(reruns=3)
7384
def test_type_keys(web: WebBot):
7485
web.browse(conftest.INDEX_PAGE)
7586
web.type_keys(['a', 'b', 'c'])
@@ -78,6 +89,7 @@ def test_type_keys(web: WebBot):
7889
assert result['data'] == ['a', 'b', 'c']
7990

8091

92+
@pytest.mark.flaky(reruns=3)
8193
def test_type_down(web: WebBot):
8294
web.browse(conftest.INDEX_PAGE)
8395
web.type_down()
@@ -86,6 +98,7 @@ def test_type_down(web: WebBot):
8698
assert result['data'] == ['ArrowDown']
8799

88100

101+
@pytest.mark.flaky(reruns=3)
89102
def test_type_left(web: WebBot):
90103
web.browse(conftest.INDEX_PAGE)
91104
web.type_left()
@@ -94,6 +107,7 @@ def test_type_left(web: WebBot):
94107
assert result['data'] == ['ArrowLeft']
95108

96109

110+
@pytest.mark.flaky(reruns=3)
97111
def test_type_right(web: WebBot):
98112
web.browse(conftest.INDEX_PAGE)
99113
web.type_right()
@@ -102,6 +116,7 @@ def test_type_right(web: WebBot):
102116
assert result['data'] == ['ArrowRight']
103117

104118

119+
@pytest.mark.flaky(reruns=3)
105120
def test_type_up(web: WebBot):
106121
web.browse(conftest.INDEX_PAGE)
107122
web.type_up()
@@ -110,6 +125,7 @@ def test_type_up(web: WebBot):
110125
assert result['data'] == ['ArrowUp']
111126

112127

128+
@pytest.mark.flaky(reruns=3)
113129
def test_backspace(web: WebBot):
114130
web.browse(conftest.INDEX_PAGE)
115131
web.backspace()
@@ -118,6 +134,7 @@ def test_backspace(web: WebBot):
118134
assert result['data'] == ['Backspace']
119135

120136

137+
@pytest.mark.flaky(reruns=3)
121138
def test_hold_shift(web: WebBot):
122139
web.browse(conftest.INDEX_PAGE)
123140
web.hold_shift()
@@ -129,6 +146,7 @@ def test_hold_shift(web: WebBot):
129146
assert result['data'] == ['Shift', 'A', 'a']
130147

131148

149+
@pytest.mark.flaky(reruns=3)
132150
def test_space(web: WebBot):
133151
web.browse(conftest.INDEX_PAGE)
134152
web.space()
@@ -137,6 +155,7 @@ def test_space(web: WebBot):
137155
assert result['data'] == ['Space']
138156

139157

158+
@pytest.mark.flaky(reruns=3)
140159
def test_page_down(web: WebBot):
141160
web.browse(conftest.INDEX_PAGE)
142161
web.page_down()
@@ -145,6 +164,7 @@ def test_page_down(web: WebBot):
145164
assert result['data'] == ['PageDown']
146165

147166

167+
@pytest.mark.flaky(reruns=3)
148168
def test_page_up(web: WebBot):
149169
web.browse(conftest.INDEX_PAGE)
150170
web.page_up()
@@ -153,6 +173,7 @@ def test_page_up(web: WebBot):
153173
assert result['data'] == ['PageUp']
154174

155175

176+
@pytest.mark.flaky(reruns=3)
156177
def test_key_tab(web: WebBot):
157178
web.browse(conftest.INDEX_PAGE)
158179
web.tab()

tests/test_mouse.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def test_triple_click_relative(web: WebBot):
4848
web.browse(conftest.INDEX_PAGE)
4949

5050
web.add_image('mouse', os.path.join(conftest.PROJECT_DIR, 'resources', 'mouse.png'))
51-
if not web.find("mouse", matching=0.97, waiting_time=10_000):
51+
if not web.find("mouse", matching=0.97, waiting_time=10_000, x=20, y=30, width=310, height=170):
5252
raise Exception('Image not found: mouse')
5353
web.triple_click_relative(16, 140)
5454

@@ -86,7 +86,7 @@ def test_left_click_relative(web: WebBot):
8686
web.browse(conftest.INDEX_PAGE)
8787

8888
web.add_image('mouse', os.path.join(conftest.PROJECT_DIR, 'resources', 'mouse.png'))
89-
if not web.find("mouse", matching=0.97, waiting_time=10_000):
89+
if not web.find("mouse", matching=0.97, waiting_time=10_000, x=20, y=30, width=310, height=170):
9090
raise Exception('Image not found: mouse')
9191
web.click_relative(16, 140)
9292

@@ -101,7 +101,7 @@ def test_left_double_click_relative(web: WebBot):
101101
web.browse(conftest.INDEX_PAGE)
102102

103103
web.add_image('mouse', os.path.join(conftest.PROJECT_DIR, 'resources', 'mouse.png'))
104-
if not web.find("mouse", matching=0.97, waiting_time=10_000):
104+
if not web.find("mouse", matching=0.97, waiting_time=10_000, x=20, y=30, width=310, height=170):
105105
raise Exception('Image not found: mouse')
106106
web.double_click_relative(16, 140)
107107

@@ -115,7 +115,7 @@ def test_right_click_relative(web: WebBot):
115115
web.browse(conftest.INDEX_PAGE)
116116

117117
web.add_image('mouse', os.path.join(conftest.PROJECT_DIR, 'resources', 'mouse.png'))
118-
if not web.find("mouse", matching=0.97, waiting_time=10_000):
118+
if not web.find("mouse", matching=0.97, waiting_time=10_000, x=20, y=30, width=310, height=170):
119119
raise Exception('Image not found: mouse')
120120
web.right_click_relative(16, 140)
121121

@@ -167,7 +167,7 @@ def test_move_relative(web: WebBot):
167167
web.browse(conftest.INDEX_PAGE)
168168

169169
web.add_image('mouse', os.path.join(conftest.PROJECT_DIR, 'resources', 'mouse.png'))
170-
if not web.find("mouse", matching=0.97, waiting_time=10_000):
170+
if not web.find("mouse", matching=0.97, waiting_time=10_000, x=20, y=30, width=310, height=170):
171171
raise Exception('Image not found: mouse')
172172
web.move()
173173
web.move_relative(16, 140)

0 commit comments

Comments
 (0)