Skip to content

Commit 3b2b96c

Browse files
committed
Add "wait_for_query_selector()" method
1 parent e014f72 commit 3b2b96c

File tree

3 files changed

+67
-8
lines changed

3 files changed

+67
-8
lines changed

help_docs/method_summary.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,8 @@ self.generate_traffic_chain(pages, loops=1)
663663
self.get_element(selector, by="css selector", timeout=None)
664664
# Duplicates: self.wait_for_element_present(selector, by="css selector", timeout=None)
665665

666+
self.wait_for_query_selector(selector, by="css selector", timeout=None)
667+
666668
self.assert_element_present(selector, by="css selector", timeout=None)
667669

668670
self.assert_elements_present(*args, **kwargs)

seleniumbase/fixtures/base_case.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10412,12 +10412,28 @@ def get_element(self, selector, by="css selector", timeout=None):
1041210412
The element does not need be visible (it may be hidden)."""
1041310413
self.__check_scope()
1041410414
if not timeout:
10415-
timeout = settings.SMALL_TIMEOUT
10416-
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
10415+
timeout = settings.LARGE_TIMEOUT
10416+
if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
1041710417
timeout = self.__get_new_timeout(timeout)
1041810418
selector, by = self.__recalculate_selector(selector, by)
1041910419
return self.wait_for_element_present(selector, by=by, timeout=timeout)
1042010420

10421+
def wait_for_query_selector(
10422+
self, selector, by="css selector", timeout=None
10423+
):
10424+
"""Waits for an element to appear in the HTML of a page.
10425+
The element does not need be visible (it may be hidden).
10426+
This method uses document.querySelector() over Selenium."""
10427+
self.__check_scope()
10428+
if not timeout:
10429+
timeout = settings.LARGE_TIMEOUT
10430+
if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
10431+
timeout = self.__get_new_timeout(timeout)
10432+
css_selector = self.convert_to_css_selector(selector, by=by)
10433+
return js_utils.wait_for_css_query_selector(
10434+
self.driver, css_selector, timeout
10435+
)
10436+
1042110437
def assert_element_present(
1042210438
self, selector, by="css selector", timeout=None
1042310439
):

seleniumbase/fixtures/js_utils.py

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -251,19 +251,60 @@ def safe_execute_script(driver, script):
251251
driver.execute_script(script)
252252

253253

254+
def remove_extra_slashes(selector):
255+
if selector.count('\\"') > 0:
256+
if selector.count('\\"') == selector.count('"'):
257+
selector = selector.replace('\\"', '"')
258+
elif selector.count('\\"') == selector[1:-1].count('"') and (
259+
"'" not in selector[1:-1]
260+
):
261+
selector = "'" + selector[1:-1].replace('\\"', '"') + "'"
262+
else:
263+
pass
264+
if selector.count("\\'") > 0:
265+
if selector.count("\\'") == selector.count("'"):
266+
selector = selector.replace("\\'", "'")
267+
elif selector.count("\\'") == selector[1:-1].count("'") and (
268+
'"' not in selector[1:-1]
269+
):
270+
selector = '"' + selector[1:-1].replace("\\'", "'") + '"'
271+
else:
272+
pass
273+
return selector
274+
275+
276+
def optimize_selector(selector):
277+
if (len(selector) > 2 and selector[0] == "'") and (
278+
selector[-1] == "'" and '"' not in selector[1:-1]
279+
):
280+
selector = '"' + selector[1:-1] + '"'
281+
if (
282+
selector.count('"') == 0
283+
and selector.count("'") >= 2
284+
and selector.count("'") % 2 == 0
285+
and "='" in selector
286+
and "']" in selector
287+
):
288+
swap_char = "*_SWAP_CHAR_*"
289+
selector = selector.replace("'", swap_char)
290+
selector = selector.replace('"', "'")
291+
selector = selector.replace(swap_char, '"')
292+
return selector
293+
294+
254295
def wait_for_css_query_selector(
255-
driver, selector, timeout=settings.SMALL_TIMEOUT
296+
driver, selector, timeout=settings.LARGE_TIMEOUT
256297
):
257298
element = None
299+
selector = escape_quotes_if_needed(selector)
300+
selector = remove_extra_slashes(selector)
301+
selector = optimize_selector(selector)
302+
script = """return document.querySelector('%s');""" % selector
258303
start_ms = time.time() * 1000.0
259304
stop_ms = start_ms + (timeout * 1000.0)
260305
for x in range(int(timeout * 10)):
261306
try:
262-
selector = re.escape(selector)
263-
selector = escape_quotes_if_needed(selector)
264-
element = driver.execute_script(
265-
"""return document.querySelector('%s');""" % selector
266-
)
307+
element = driver.execute_script(script)
267308
if element:
268309
return element
269310
except Exception:

0 commit comments

Comments
 (0)