Skip to content

Commit

Permalink
Add waiter for page load after selected Taurus actions (Blazemeter#1443)
Browse files Browse the repository at this point in the history
  • Loading branch information
havja authored Dec 21, 2020
1 parent d71ea48 commit 01c18cc
Show file tree
Hide file tree
Showing 13 changed files with 81 additions and 10 deletions.
6 changes: 6 additions & 0 deletions bzt/modules/apiritif/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@ class ApiritifScriptGenerator(object):
'resize', 'maximize', 'alert', 'waitFor'
])

ACTIONS_WITH_WAITER = ['go', 'click', 'doubleclick', 'contextclick', 'drag', 'select', 'type', 'script']

EXECUTION_BLOCKS = "|".join(['if', 'loop', 'foreach'])

# Python AST docs: https://greentreesnakes.readthedocs.io/en/latest/
Expand Down Expand Up @@ -723,6 +725,9 @@ def _gen_action(self, action_config):
if not action_elements and not self.ignore_unknown_actions:
raise TaurusInternalException("Could not build code for action: %s" % action_config)

if atype.lower() in self.ACTIONS_WITH_WAITER:
action_elements.append(ast_call(func=ast_attr("waiter"), args=[]))

return [ast.Expr(element) for element in action_elements]

def _gen_foreach_mngr(self, action_config):
Expand Down Expand Up @@ -1108,6 +1113,7 @@ def _gen_imports(self):

imports.append(ast.parse(self.IMPORTS % source).body)
self.selenium_extras.add("get_locator")
self.selenium_extras.add("waiter")
extra_names = [ast.alias(name=name, asname=None) for name in self.selenium_extras]
imports.append(
ast.ImportFrom(
Expand Down
9 changes: 9 additions & 0 deletions bzt/resources/selenium_extras.py
Original file line number Diff line number Diff line change
Expand Up @@ -445,3 +445,12 @@ def close_window(window_name=None):
switch_window(window_name)
_get_driver().close()


def waiter():
"""
Allows waiting for page to finish loading before performing other actions on non completely loaded page
"""
WebDriverWait(_get_driver(), _get_timeout())\
.until(lambda driver: driver.execute_script('return document.readyState') == 'complete',
message="Timeout occurred while waiting for page to finish loading.")

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Added waiter for page load after selected Apiritif actions
3 changes: 2 additions & 1 deletion tests/resources/selenium/external_logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from selenium.webdriver.support import expected_conditions as econd
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from bzt.resources.selenium_extras import dialogs_replace, add_logging_handlers, get_locator
from bzt.resources.selenium_extras import dialogs_replace, add_logging_handlers, waiter, get_locator

class TestSample(unittest.TestCase):

Expand All @@ -44,6 +44,7 @@ def _1_Test(self):
self.driver.get('http://blazedemo.com/')

dialogs_replace()
waiter()
apiritif.external_log('end: go(http://blazedemo.com/)')
apiritif.external_log('start: log(leaving blazedemo)')
apiritif.external_log('leaving blazedemo')
Expand Down
13 changes: 12 additions & 1 deletion tests/resources/selenium/generated_from_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from selenium.webdriver.support import expected_conditions as econd
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from bzt.resources.selenium_extras import dialogs_answer_on_next_confirm, dialogs_get_next_alert, dialogs_answer_on_next_prompt, dialogs_get_next_confirm, dialogs_answer_on_next_alert, get_locator, wait_for, switch_window, close_window, dialogs_replace, switch_frame, dialogs_get_next_prompt, open_window
from bzt.resources.selenium_extras import dialogs_get_next_prompt, close_window, open_window, switch_window, dialogs_replace, get_locator, waiter, dialogs_answer_on_next_confirm, dialogs_get_next_alert, dialogs_answer_on_next_prompt, switch_frame, dialogs_answer_on_next_alert, dialogs_get_next_confirm, wait_for
reader_1 = apiritif.CSVReaderPerThread('first.csv', loop=True)
reader_2 = apiritif.CSVReaderPerThread('second.csv', loop=False)

Expand Down Expand Up @@ -61,11 +61,13 @@ def _1_(self):
ActionChains(self.driver).double_click(self.driver.find_element(
var_loc_chain[0],
var_loc_chain[1])).perform()
waiter()

var_loc_chain = get_locator([{'xpath': '/html/body/div[3]/form/select[1]'}])
ActionChains(self.driver).context_click(self.driver.find_element(
var_loc_chain[0],
var_loc_chain[1])).perform()
waiter()

var_loc_chain = get_locator([{'xpath': '/html/body/div[3]/form/select[1]'}])
ActionChains(self.driver).click_and_hold(self.driver.find_element(
Expand All @@ -81,6 +83,7 @@ def _1_(self):
Select(self.driver.find_element(
var_loc_select[0],
var_loc_select[1])).select_by_visible_text('London')
waiter()

var_loc_keys = get_locator([{'css': 'body input.btn.btn-primary'}])
self.driver.find_element(
Expand Down Expand Up @@ -110,6 +113,7 @@ def _1_(self):
self.driver.find_element(
var_loc_keys[0],
var_loc_keys[1]).send_keys('B')
waiter()

var_loc_keys = get_locator([{'name': 'toPort'}])
self.driver.find_element(
Expand All @@ -123,16 +127,19 @@ def _1_(self):
self.driver.find_element(
var_loc_keys[0],
var_loc_keys[1]).send_keys(Keys.ENTER)
waiter()

var_loc_keys = get_locator([{'xpath': '//div[3]/form/select[1]//option[3]'}])
self.driver.find_element(
var_loc_keys[0],
var_loc_keys[1]).click()
waiter()

var_loc_keys = get_locator([{'xpath': '//div[3]/form/select[2]//option[6]'}])
self.driver.find_element(
var_loc_keys[0],
var_loc_keys[1]).click()
waiter()
switch_window('0')
open_window('some.url')
switch_window('win_ser_local')
Expand All @@ -148,6 +155,7 @@ def _1_(self):
var_loc_keys[0],
var_loc_keys[1]).submit()
self.driver.execute_script("alert('This is Sparta');")
waiter()

for i in range(10):
if ((i % 2) == 0):
Expand All @@ -161,6 +169,7 @@ def _1_(self):
source[1]), self.driver.find_element(
target[0],
target[1])).perform()
waiter()
switch_frame(self.driver.find_element(By.NAME, 'my_frame'))
switch_frame(self.driver.find_element(By.NAME, 'top_frame'))
switch_frame(self.driver.find_element(By.XPATH, "//*[@id='result']"))
Expand Down Expand Up @@ -188,6 +197,7 @@ def _1_(self):
self.driver.find_element(
var_loc_keys[0],
var_loc_keys[1]).click()
waiter()

self.vars['Title'] = self.driver.title

Expand All @@ -210,6 +220,7 @@ def _1_(self):
self.driver.get('http:\\blazemeter.com')

dialogs_replace()
waiter()

dialog = dialogs_get_next_alert()
self.assertIsNotNone(dialog, 'No dialog of type alert appeared')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from selenium.webdriver.support import expected_conditions as econd
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from bzt.resources.selenium_extras import wait_for, dialogs_replace, get_locator
from bzt.resources.selenium_extras import dialogs_replace, get_locator, wait_for, waiter

class TestLocScAppium(unittest.TestCase):

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from selenium.webdriver.support import expected_conditions as econd
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from bzt.resources.selenium_extras import wait_for, dialogs_replace, get_locator, add_flow_markers
from bzt.resources.selenium_extras import get_locator, wait_for, dialogs_replace, waiter, add_flow_markers

class TestLocSc(unittest.TestCase):

Expand Down
16 changes: 15 additions & 1 deletion tests/resources/selenium/generated_from_requests_foreach.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from selenium.webdriver.support import expected_conditions as econd
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from bzt.resources.selenium_extras import get_locator, get_elements
from bzt.resources.selenium_extras import get_locator, waiter, get_elements

class TestLocSc(unittest.TestCase):

Expand Down Expand Up @@ -63,15 +63,21 @@ def _1_Foreach_test(self):
else:
raise NoSuchElementException(("The element '%s' (tag name: '%s', text: '%s') is not a contenteditable element" % ('el', el.tag_name, el.text)))
el.click()
waiter()

var_loc_keys = get_locator([{'css': 'input-cls'}, {'xpath': '//input'}], el)
el.find_element(
var_loc_keys[0],
var_loc_keys[1]).click()
waiter()
ActionChains(self.driver).double_click(el).perform()
waiter()
ActionChains(self.driver).double_click(el).perform()
waiter()
ActionChains(self.driver).context_click(el).perform()
waiter()
ActionChains(self.driver).context_click(el).perform()
waiter()
ActionChains(self.driver).click_and_hold(el).perform()
ActionChains(self.driver).click_and_hold(el).perform()
ActionChains(self.driver).release(el).perform()
Expand All @@ -85,23 +91,29 @@ def _1_Foreach_test(self):
ActionChains(self.driver).drag_and_drop(el, self.driver.find_element(
target[0],
target[1])).perform()
waiter()

source = get_locator([{'id': 'id34'}])
ActionChains(self.driver).drag_and_drop(self.driver.find_element(
source[0],
source[1]), el).perform()
waiter()

target = get_locator([{'id': 'id12'}])
ActionChains(self.driver).drag_and_drop(el, self.driver.find_element(
target[0],
target[1])).perform()
waiter()

source = get_locator([{'id': 'id34'}])
ActionChains(self.driver).drag_and_drop(self.driver.find_element(
source[0],
source[1]), el).perform()
waiter()
Select(el).select_by_visible_text('value')
waiter()
Select(el).select_by_visible_text('value')
waiter()

self.vars['my_var'] = el.get_attribute('innerText')

Expand All @@ -112,8 +124,10 @@ def _1_Foreach_test(self):
self.vars['my_var'] = el.get_attribute('value')
el.clear()
el.send_keys('text')
waiter()
el.clear()
el.send_keys('text')
waiter()
el.submit()
el.submit()
el.send_keys(Keys.ENTER)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from selenium.webdriver.support import expected_conditions as econd
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from bzt.resources.selenium_extras import get_locator, dialogs_replace
from bzt.resources.selenium_extras import dialogs_replace, waiter, get_locator

class TestLocSc(unittest.TestCase):

Expand All @@ -44,6 +44,7 @@ def _1_Conditions_test(self):
self.driver.get('http://blazedemo.com')

dialogs_replace()
waiter()

test = self.driver.execute_script('return document.getElementsByName("fromPort")[0].length > 0;')
if test:
Expand All @@ -52,6 +53,7 @@ def _1_Conditions_test(self):
self.driver.find_element(
var_loc_keys[0],
var_loc_keys[1]).click()
waiter()
sleep(1.0)

test = self.driver.execute_script('return document.getElementsByClassName("table")[0].rows.length > 5;')
Expand All @@ -61,6 +63,7 @@ def _1_Conditions_test(self):
self.driver.find_element(
var_loc_keys[0],
var_loc_keys[1]).click()
waiter()

test = self.driver.execute_script('return document.getElementById("{}").value === \'\';'.format(self.vars['input_name_id']))
if test:
Expand All @@ -72,6 +75,7 @@ def _1_Conditions_test(self):
self.driver.find_element(
var_loc_keys[0],
var_loc_keys[1]).send_keys('John Doe')
waiter()
else:

var_loc_keys = get_locator([{'id': self.vars['input_name_id']}])
Expand All @@ -81,11 +85,13 @@ def _1_Conditions_test(self):
self.driver.find_element(
var_loc_keys[0],
var_loc_keys[1]).send_keys('Jack Green')
waiter()

var_loc_keys = get_locator([{'xpath': '/html/body/div[2]/form/div[11]/div/input'}])
self.driver.find_element(
var_loc_keys[0],
var_loc_keys[1]).click()
waiter()
sleep(5.0)
else:

Expand All @@ -99,6 +105,7 @@ def _1_Conditions_test(self):
self.driver.find_element(
var_loc_keys[0],
var_loc_keys[1]).send_keys('my text')
waiter()

test = self.driver.execute_script('return window.screen.width > 1000;')
if test:
Expand All @@ -111,6 +118,7 @@ def _1_Conditions_test(self):
self.driver.find_element(
var_loc_keys[0],
var_loc_keys[1]).click()
waiter()

def test_locsc(self):
self._1_Conditions_test()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from selenium.webdriver.support import expected_conditions as econd
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from bzt.resources.selenium_extras import get_loop_range, get_locator
from bzt.resources.selenium_extras import get_locator, get_loop_range, waiter

class TestLocSc(unittest.TestCase):

Expand Down Expand Up @@ -47,6 +47,7 @@ def _1_None(self):
self.driver.find_element(
var_loc_keys[0],
var_loc_keys[1]).click()
waiter()

def test_locsc(self):
self._1_None()
Expand Down
2 changes: 1 addition & 1 deletion tests/resources/selenium/generated_from_requests_remote.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from selenium.webdriver.support import expected_conditions as econd
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from bzt.resources.selenium_extras import add_flow_markers, dialogs_replace, get_locator, wait_for
from bzt.resources.selenium_extras import add_flow_markers, waiter, wait_for, dialogs_replace, get_locator

class TestLocScRemote(unittest.TestCase):

Expand Down
Loading

0 comments on commit 01c18cc

Please sign in to comment.