Skip to content

Commit a1245ce

Browse files
authored
Merge pull request #19 from hhslepicka/many_fixes
Many fixes from Testing
2 parents 687047c + 999d571 commit a1245ce

File tree

5 files changed

+37
-14
lines changed

5 files changed

+37
-14
lines changed

botcity/web/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .bot import WebBot, Browser, BROWSER_CONFIGS # noqa: F401, F403
1+
from .bot import WebBot, Browser, BROWSER_CONFIGS, By # noqa: F401, F403
22

33
from botcity.web._version import get_versions
44
__version__ = get_versions()['version']

botcity/web/bot.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from PIL import Image
1818
from selenium.common.exceptions import InvalidSessionIdException
1919
from selenium.webdriver.common.action_chains import ActionChains
20+
from selenium.common.exceptions import StaleElementReferenceException
2021
from selenium.webdriver.common.by import By
2122
from selenium.webdriver.common.keys import Keys
2223
from selenium.webdriver.remote.webelement import WebElement
@@ -61,14 +62,15 @@ def __init__(self, headless=False):
6162
self._clipboard = ""
6263

6364
# Stub mouse coordinates
65+
self._html_elem = None
6466
self._x = 0
6567
self._y = 0
6668

6769
# State for Key modifiers
6870
self._shift_hold = False
6971

7072
self._dimensions = (1600, 900)
71-
self._download_folder_path = os.path.join(os.path.expanduser("~"), "Desktop")
73+
self._download_folder_path = os.getcwd()
7274

7375
@property
7476
def driver(self):
@@ -94,6 +96,7 @@ def driver_path(self, driver_path):
9496
driver_path (str): The full path to the proper webdriver path used for the selected browser.
9597
If set to None, the code will look into the PATH for the proper file when starting the browser.
9698
"""
99+
driver_path = os.path.abspath(os.path.expanduser(os.path.expandvars(driver_path)))
97100
if driver_path and not os.path.isfile(driver_path):
98101
raise ValueError("Invalid driver_path. The file does not exist.")
99102
self._driver_path = driver_path
@@ -943,14 +946,17 @@ def print_pdf(self, path=None, print_options=None):
943946
str: the saved file path
944947
"""
945948
title = self.page_title() or "document"
946-
default_path = os.path.expanduser(os.path.join("~", "Desktop", f"{title}.pdf"))
949+
timeout = 60000
950+
if not self.page_title():
951+
timeout = 1000
952+
default_path = os.path.expanduser(os.path.join(self.download_folder_path, f"{title}.pdf"))
947953

948954
if self.browser in [Browser.CHROME, Browser.EDGE] and not self.headless:
949955
# Chrome still does not support headless webdriver print
950956
# but Firefox does.
951957
self.execute_javascript("window.print();")
952958
# We need to wait for the file to be available in this case.
953-
self.wait_for_file(default_path)
959+
self.wait_for_file(default_path, timeout=timeout)
954960
return default_path
955961

956962
if print_options is None:
@@ -973,6 +979,7 @@ def print_pdf(self, path=None, print_options=None):
973979
def wait_for_downloads(self, timeout: int = 120000):
974980
"""
975981
Wait for all downloads to be finished.
982+
Beware that this method replaces the current page with the downloads window.
976983
977984
Args:
978985
timeout (int, optional): Timeout in millis. Defaults to 120000.
@@ -994,7 +1001,7 @@ def find_elements(self, selector: str, by: By = By.CSS_SELECTOR) -> List[WebElem
9941001
9951002
**Example:**
9961003
```python
997-
from botcity.web.bot import By
1004+
from botcity.web import By
9981005
...
9991006
# Find element by ID
10001007
all_cells = self.find_elements("//td", By.XPATH)
@@ -1017,7 +1024,7 @@ def find_element(self, selector: str, by: str = By.CSS_SELECTOR) -> WebElement:
10171024
10181025
**Example:**
10191026
```python
1020-
from botcity.web.bot import By
1027+
from botcity.web import By
10211028
...
10221029
# Find element by ID
10231030
elem = self.find_element("my_elem", By.ID)
@@ -1106,7 +1113,20 @@ def mouse_move(self, x, y):
11061113
y (int): The Y coordinate
11071114
11081115
"""
1109-
# ActionChains(self._driver).move_by_offset(-self._x, -self._y).perform()
1116+
if self.browser == Browser.FIREFOX:
1117+
# Reset coordinates if the page has gone stale. Only required for Firefox
1118+
if self._html_elem is None:
1119+
self._html_elem = self._driver.find_element_by_tag_name('body')
1120+
self._x = 0
1121+
self._y = 0
1122+
else:
1123+
try:
1124+
self._html_elem.is_enabled()
1125+
except StaleElementReferenceException:
1126+
self._html_elem = self._driver.find_element_by_tag_name('body')
1127+
self._x = 0
1128+
self._y = 0
1129+
11101130
mx = x - self._x
11111131
my = y - self._y
11121132
self._x = x
@@ -1798,6 +1818,7 @@ def wait_for_file(self, path, timeout=60000):
17981818
status (bool): Whether or not the file was available before the timeout
17991819
18001820
"""
1821+
path = os.path.abspath(os.path.expanduser(os.path.expandvars(path)))
18011822
start_time = time.time()
18021823

18031824
while True:

botcity/web/browsers/chrome.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def default_options(headless=False, download_folder_path=None, user_data_dir=Non
4646
chrome_options.add_argument(f"--user-data-dir={user_data_dir}")
4747

4848
if not download_folder_path:
49-
download_folder_path = os.path.join(os.path.expanduser("~"), "Desktop")
49+
download_folder_path = os.getcwd()
5050

5151
app_state = {
5252
'recentDestinations': [{
@@ -67,7 +67,9 @@ def default_options(headless=False, download_folder_path=None, user_data_dir=Non
6767
"kind": "local",
6868
"namePattern": "Save as PDF",
6969
},
70-
"safebrowsing.enabled": True
70+
"safebrowsing.enabled": True,
71+
"credentials_enable_service": False,
72+
"profile.password_manager_enabled": False
7173
}
7274

7375
chrome_options.add_experimental_option("prefs", prefs)

botcity/web/browsers/edge.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def default_options(headless=False, download_folder_path=None, user_data_dir=Non
4646
edge_options.add_argument(f"--user-data-dir={user_data_dir}")
4747

4848
if not download_folder_path:
49-
download_folder_path = os.path.join(os.path.expanduser("~"), "Desktop")
49+
download_folder_path = os.getcwd()
5050

5151
app_state = {
5252
"recentDestinations": [{
@@ -70,7 +70,9 @@ def default_options(headless=False, download_folder_path=None, user_data_dir=Non
7070
"kind": "local",
7171
"namePattern": "Save as PDF",
7272
},
73-
"safebrowsing.enabled": True
73+
"safebrowsing.enabled": True,
74+
"credentials_enable_service": False,
75+
"profile.password_manager_enabled": False
7476
}
7577

7678
edge_options.add_experimental_option("prefs", prefs)

botcity/web/browsers/firefox.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ def default_options(headless=False, download_folder_path=None, user_data_dir=Non
346346
firefox_profile.set_preference('browser.download.folderList', 2)
347347
firefox_profile.set_preference('browser.download.manager.showWhenStarting', False)
348348
if not download_folder_path:
349-
download_folder_path = os.path.join(os.path.expanduser("~"), "Desktop")
349+
download_folder_path = os.getcwd()
350350
firefox_profile.set_preference('browser.download.dir', download_folder_path)
351351
firefox_profile.set_preference('general.warnOnAboutConfig', False)
352352

@@ -362,9 +362,7 @@ def default_options(headless=False, download_folder_path=None, user_data_dir=Non
362362

363363

364364
def wait_for_downloads(driver):
365-
print('Start Wait for Downloads')
366365
if not driver.current_url.startswith("about:downloads"):
367-
print('Open the downloads tab')
368366
driver.get("about:downloads")
369367

370368
return driver.execute_script("""

0 commit comments

Comments
 (0)