Skip to content

Commit d69181d

Browse files
committed
ENH: Implement compability find_element_by in selenium 4
1 parent b6618f2 commit d69181d

File tree

6 files changed

+136
-6
lines changed

6 files changed

+136
-6
lines changed

botcity/web/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
### PATCH Selenium for Compat ###
2+
from .compat import patch_selenium
3+
patch_selenium()
4+
15
from .bot import WebBot, Browser, BROWSER_CONFIGS, By, PageLoadStrategy # noqa: F401, F403
26
from .parsers import table_to_dict, data_from_row, sanitize_header # noqa: F401, F403
37
from .util import element_as_select # noqa: F401, F403

botcity/web/bot.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from selenium.webdriver.support.wait import WebDriverWait, TimeoutException, NoSuchElementException
2727
from selenium.webdriver.support import expected_conditions as EC
2828

29-
from . import config, cv2find
29+
from . import config, cv2find, compat
3030
from .browsers import BROWSER_CONFIGS, Browser, PageLoadStrategy
3131

3232
try:
@@ -235,7 +235,6 @@ def start_browser(self):
235235
"""
236236
Starts the selected browser.
237237
"""
238-
239238
def check_driver():
240239
# Look for driver
241240
driver_name = BROWSER_CONFIGS.get(self.browser).get("driver")
@@ -260,11 +259,14 @@ def check_driver():
260259
self.capabilities = cap
261260
driver_path = self.driver_path or check_driver()
262261
self.driver_path = driver_path
263-
service = BROWSER_CONFIGS.get(self.browser).get("service")
264-
service = service(executable_path=self.driver_path)
265-
service.desired_capabilities = cap
262+
if compat.version_selenium_is_larger_than_four():
263+
service = BROWSER_CONFIGS.get(self.browser).get("service")
264+
service = service(executable_path=self.driver_path)
265+
service.desired_capabilities = cap
266266

267-
self._driver = driver_class(options=opt, service=service)
267+
self._driver = driver_class(options=opt, service=service)
268+
else:
269+
self._driver = driver_class(options=opt, desired_capabilities=cap, executable_path=driver_path)
268270
self.set_screen_resolution()
269271

270272
def stop_browser(self):

botcity/web/compat.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import warnings
2+
3+
4+
def patch_selenium():
5+
if version_selenium_is_larger_than_four():
6+
from selenium import webdriver
7+
8+
web_element = webdriver.remote.webelement.WebElement
9+
10+
remote_driver = webdriver.remote.webdriver.WebDriver
11+
12+
bys = ['id', 'class name', 'xpath', 'link text', 'partial link text', 'name', 'css selector', 'tag name']
13+
for by in bys:
14+
name = '_'.join(by.split(' '))
15+
find_element_by_function_name = f"find_element_by_{name}"
16+
find_elements_by_function_name = f"find_elements_by_{name}"
17+
setattr(web_element, find_element_by_function_name, find_element_by(by))
18+
setattr(web_element, find_elements_by_function_name, find_elements_by(by))
19+
setattr(remote_driver, find_element_by_function_name, find_element_by(by))
20+
setattr(remote_driver, find_elements_by_function_name, find_elements_by(by))
21+
22+
23+
def find_element_by(by):
24+
def func(self, value):
25+
warnings.warn("This function is deprecated in version 4, please review the usage for find_element.",
26+
category=DeprecationWarning, stacklevel=2)
27+
return self.find_element(by=by, value=value)
28+
return func
29+
30+
31+
def find_elements_by(by):
32+
def func(self, value):
33+
warnings.warn("This function is deprecated in version 4, please review the usage for find_elements.",
34+
category=DeprecationWarning, stacklevel=2)
35+
return self.find_elements(by=by, value=value)
36+
return func
37+
38+
39+
def version_selenium_is_larger_than_four():
40+
import selenium
41+
from packaging import version
42+
se_version = version.parse(selenium.__version__)
43+
44+
needs_patch = se_version >= version.parse("4.0")
45+
return needs_patch

teste.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from botcity.web import WebBot, Browser, By
2+
bot = WebBot()
3+
4+
# Firefox
5+
# bot.driver_path = "/home/kayque/Downloads/geckodriver-v0.32.0-linux64/geckodriver"
6+
# bot.browser = Browser.FIREFOX
7+
# bot.headless = True
8+
9+
# Chrome
10+
bot.driver_path = "/home/kayque/Downloads/chromedriver_linux64(9)/chromedriver"
11+
bot.browser = Browser.CHROME
12+
bot.headless = False
13+
14+
# Edge
15+
# bot.driver_path = "/home/kayque/Downloads/edgedriver_linux64/msedgedriver"
16+
# bot.browser = Browser.EDGE
17+
# bot.headless = True
18+
19+
try:
20+
bot.start_browser()
21+
bot.browse("https://google.com")
22+
search = bot.find_element(selector="/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div", by=By.XPATH)
23+
search_div2 = search.find_elements_by_tag_name("div")
24+
search_input = search_div2[2].find_element_by_tag_name("input")
25+
teste1 = bot.driver.find_element_by_id("gb")
26+
teste2 = bot.driver.find_element_by_xpath("/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input")
27+
teste3 = search.find_element_by_tag_name("input")
28+
teste4 = bot.driver.find_elements_by_tag_name("input")
29+
print(search)
30+
search.send_keys("cotação dolar")
31+
bot.enter()
32+
value = bot.find_element(selector="/html/body/div[7]/div/div[10]/div/div[2]/div[2]/div/div/div[1]/div/div/div/div/div/div/div/div[3]/div[1]/div[1]/div[2]/span[1]",
33+
by=By.XPATH)
34+
date = bot.find_element(selector="/html/body/div[7]/div/div[10]/div/div[2]/div[2]/div/div/div[1]/div/div/div/div/div/div/div/div[3]/div[1]/div[2]/span", by=By.XPATH)
35+
36+
print(f"$ 1 = R$ {value.text}")
37+
print(f"Date: {date.text}")
38+
except Exception as error:
39+
print(error)
40+
finally:
41+
bot.stop_browser()

teste2.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from selenium import webdriver
2+
3+
web_element = webdriver.remote.webelement.WebElement
4+
5+
remote_driver = webdriver.remote.webdriver.WebDriver
6+
7+
8+
def find_by_id(self, _id):
9+
10+
return self.find_element("id", _id)
11+
12+
13+
web_element.find_element_by_id = find_by_id
14+
15+
remote_driver.find_element_by_id = find_by_id
16+
17+
driver = webdriver.Firefox(service=webdriver.firefox.service.Service(executable_path="/home/kayque/Downloads/geckodriver-v0.32.0-linux64/geckodriver"))
18+
19+
driver.get("https://www.google.com")
20+
21+
body = driver.find_element("tag name", "body")
22+
23+
test1 = body.find_element_by_id("gb")
24+
25+
test2 = driver.find_element_by_id("gb")
26+
27+
driver.quit()
28+
29+
from packaging import version
30+
31+
import selenium
32+
33+
se_version = version.parse(selenium.__version__)
34+
35+
needs_patch = se_version >= version.parse("4.0")

teste3.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import warnings
2+
3+
warnings.warn("deprecated", DeprecationWarning)

0 commit comments

Comments
 (0)