pytest-based selenium tests clean/edit find elements/xpaths

use find_by id/class_name/css_selector if it is possible

use normalize-space - best way how to eliminate spaces in text during finding

use .// - to select element descendants of the context node

Change-Id: Ia7394cebf4ff9ea9aca5d19cfea004f289d28ab8
This commit is contained in:
Jan Jasek 2023-09-06 20:02:22 +02:00
parent db1859f74e
commit 6f3a2f7c85
4 changed files with 38 additions and 45 deletions

View File

@ -64,17 +64,17 @@ class Session:
'div.panel-footer button.btn')
button.click()
self.current_user = user
self.current_project = self.driver.find_element_by_xpath(
'//*[@class="context-project"]').text
self.current_project = self.driver.find_element_by_class_name(
'context-project').text
if self.current_project != project:
dropdown_project = self.driver.find_element_by_xpath(
'//*[@class="context-project"]//ancestor::ul')
dropdown_project.click()
selection = dropdown_project.find_element_by_xpath(
f'//span[contains(text(),"{project}")]')
f'.//*[normalize-space()="{project}"]')
selection.click()
self.current_project = self.driver.find_element_by_xpath(
'//*[@class="context-project"]').text
self.current_project = self.driver.find_element_by_class_name(
'context-project').text
@pytest.fixture(scope='session')

View File

@ -75,12 +75,12 @@ def test_image_create_from_local_file_demo(login, driver, image_name,
"//button[normalize-space()='Create Image']").click()
wizard = driver.find_element_by_css_selector("wizard")
wizard.find_element_by_id("imageForm-name").send_keys(image_name)
select_element = wizard.find_element_by_xpath(
".//*[@name='image_file']")
select_element = wizard.find_element_by_css_selector(
"input[name='image_file']")
select_element.send_keys(temporary_file)
wizard.find_element_by_id("imageForm-format").click()
wizard.find_element_by_xpath(
".//*[@label='QCOW2 - QEMU Emulator']").click()
wizard.find_element_by_css_selector(
"[label='QCOW2 - QEMU Emulator']").click()
wizard.find_element_by_css_selector("button.btn-primary.finish").click()
messages = widgets.get_and_dismiss_messages(driver)
assert(f"Success: Image {image_name} was successfully"

View File

@ -82,12 +82,12 @@ def select_from_transfer_table(element, label):
try:
element.find_element_by_xpath(
f"//*[text()='{label}']//ancestor::tr/td//*"
f".//*[text()='{label}']//ancestor::tr/td//*"
f"[@class='btn btn-default fa fa-arrow-up']").click()
except exceptions.NoSuchElementException:
try:
element.find_element_by_xpath(
f"//*[text()='{label}']//ancestor::tr/td//*"
f".//*[text()='{label}']//ancestor::tr/td//*"
f"[@class='btn btn-default fa fa-arrow-down']")
except exceptions.NoSuchElementException:
raise
@ -95,14 +95,14 @@ def select_from_transfer_table(element, label):
def create_new_volume_during_create_instance(driver, required_state):
create_new_volume_btn = widgets.find_already_visible_element_by_xpath(
f"//*[@id='vol-create'][text()='{required_state}']", driver
f".//*[@id='vol-create'][text()='{required_state}']", driver
)
create_new_volume_btn.click()
def delete_volume_on_instance_delete(driver, required_state):
delete_volume_btn = widgets.find_already_visible_element_by_xpath(
f"//label[contains(@ng-model, 'vol_delete_on_instance_delete')]"
f".//label[contains(@ng-model, 'vol_delete_on_instance_delete')]"
f"[text()='{required_state}']", driver)
delete_volume_btn.click()
@ -124,7 +124,7 @@ def test_create_instance_demo(login, driver, instance_name,
wizard = driver.find_element_by_css_selector("wizard")
navigation = wizard.find_element_by_css_selector("div.wizard-nav")
widgets.find_already_visible_element_by_xpath(
"//*[@id='name']", wizard).send_keys(instance_name)
".//*[@id='name']", wizard).send_keys(instance_name)
navigation.find_element_by_link_text("Networks").click()
network_table = wizard.find_element_by_css_selector(
"ng-include[ng-form=launchInstanceNetworkForm]"
@ -145,9 +145,8 @@ def test_create_instance_demo(login, driver, instance_name,
wizard.find_element_by_css_selector(
"button.btn-primary.finish").click()
widgets.find_already_visible_element_by_xpath(
f"//*[contains(text(),'{instance_name}')]//ancestor::tr/td"
f"[contains(text(),'Active')]", driver)
assert True
f"//*[text()='{instance_name}']//ancestor::tr/td"
f"[normalize-space()='Active']", driver)
def test_create_instance_from_volume_demo(login, driver, instance_name,
@ -167,7 +166,7 @@ def test_create_instance_from_volume_demo(login, driver, instance_name,
wizard = driver.find_element_by_css_selector("wizard")
navigation = wizard.find_element_by_css_selector("div.wizard-nav")
widgets.find_already_visible_element_by_xpath(
"//*[@id='name']", wizard).send_keys(instance_name)
".//*[@id='name']", wizard).send_keys(instance_name)
navigation.find_element_by_link_text("Networks").click()
network_table = wizard.find_element_by_css_selector(
"ng-include[ng-form=launchInstanceNetworkForm]"
@ -182,18 +181,17 @@ def test_create_instance_from_volume_demo(login, driver, instance_name,
source_table = wizard.find_element_by_css_selector(
"ng-include[ng-form=launchInstanceSourceForm]"
)
select_boot_sources_type_tab = source_table.find_element_by_xpath(
"//*[@id='boot-source-type']")
select_boot_sources_type_tab = source_table.find_element_by_id(
"boot-source-type")
select_boot_sources_type_tab.click()
select_boot_sources_type_tab.find_element_by_xpath(
"//option[@value='volume']").click()
select_boot_sources_type_tab.find_element_by_css_selector(
"option[value='volume']").click()
delete_volume_on_instance_delete(source_table, "No")
select_from_transfer_table(source_table, volume_name)
wizard.find_element_by_css_selector("button.btn-primary.finish").click()
widgets.find_already_visible_element_by_xpath(
f"//*[contains(text(),'{instance_name}')]//ancestor::tr/td\
[contains(text(),'Active')]", driver)
assert True
f"//*[text()='{instance_name}']//ancestor::tr/td"
f"[normalize-space()='Active']", driver)
def test_delete_instance_demo(login, driver, instance_name,
@ -236,7 +234,7 @@ def test_create_instance_admin(login, driver, instance_name,
wizard = driver.find_element_by_css_selector("wizard")
navigation = wizard.find_element_by_css_selector("div.wizard-nav")
widgets.find_already_visible_element_by_xpath(
"//*[@id='name']", wizard).send_keys(instance_name)
".//*[@id='name']", wizard).send_keys(instance_name)
navigation.find_element_by_link_text("Networks").click()
network_table = wizard.find_element_by_css_selector(
"ng-include[ng-form=launchInstanceNetworkForm]"
@ -257,9 +255,8 @@ def test_create_instance_admin(login, driver, instance_name,
wizard.find_element_by_css_selector(
"button.btn-primary.finish").click()
widgets.find_already_visible_element_by_xpath(
f"//*[contains(text(),'{instance_name}')]//ancestor::tr/td\
[contains(text(),'Active')]", driver)
assert True
f"//*[text()='{instance_name}']//ancestor::tr/td"
f"[normalize-space()='Active']", driver)
def test_delete_instance_admin(login, driver, instance_name,

View File

@ -66,11 +66,11 @@ def clear_volume_admin(volume_name, openstack_admin):
def select_from_dropdown_volume_tab(driver, dropdown_id, label):
volume_dropdown = driver.find_element_by_xpath(
f"//*[@for='{dropdown_id}']/following-sibling::div")
f".//*[@for='{dropdown_id}']/following-sibling::div")
volume_dropdown.click()
volume_dropdown_tab = volume_dropdown.find_element_by_css_selector(
"ul.dropdown-menu")
volume_dropdown_tab.find_element_by_xpath(f"//*[text()='{label}']").click()
volume_dropdown_tab.find_element_by_xpath(f".//*[text()='{label}']").click()
def test_create_empty_volume_demo(login, driver, volume_name,
@ -85,16 +85,14 @@ def test_create_empty_volume_demo(login, driver, volume_name,
driver.get(url)
driver.find_element_by_link_text("Create Volume").click()
volume_form = driver.find_element_by_css_selector(".modal-dialog form")
volume_form.find_element_by_xpath(
"//*[@id='id_name']").send_keys(volume_name)
volume_form.find_element_by_xpath(
"//*[@class='btn btn-primary'][@value='Create Volume']").click()
volume_form.find_element_by_id("id_name").send_keys(volume_name)
volume_form.find_element_by_css_selector(
".btn-primary[value='Create Volume']").click()
messages = widgets.get_and_dismiss_messages(driver)
assert f'Info: Creating volume "{volume_name}"' in messages
widgets.find_already_visible_element_by_xpath(
f"//*[contains(text(),'{volume_name}')]//ancestor::tr/td"
f"[contains(text(),'Available')]", driver)
assert True
f"//*[text()='{volume_name}']//ancestor::tr/td"
f"[normalize-space()='Available']", driver)
def test_create_volume_from_image_demo(login, driver, volume_name,
@ -110,20 +108,18 @@ def test_create_volume_from_image_demo(login, driver, volume_name,
driver.get(url)
driver.find_element_by_link_text("Create Volume").click()
volume_form = driver.find_element_by_css_selector(".modal-dialog form")
volume_form.find_element_by_xpath(
"//*[@id='id_name']").send_keys(volume_name)
volume_form.find_element_by_id("id_name").send_keys(volume_name)
select_from_dropdown_volume_tab(
volume_form, 'id_volume_source_type', 'Image')
select_from_dropdown_volume_tab(
volume_form, 'id_image_source', image_source_name)
volume_form.find_element_by_xpath(
"//*[@class='btn btn-primary'][@value='Create Volume']").click()
volume_form.find_element_by_css_selector(
".btn-primary[value='Create Volume']").click()
messages = widgets.get_and_dismiss_messages(driver)
assert f'Info: Creating volume "{volume_name}"' in messages
widgets.find_already_visible_element_by_xpath(
f"//*[contains(text(),'{volume_name}')]//ancestor::tr/td"
f"[contains(text(),'Available')]", driver)
assert True
f"//*[text()='{volume_name}']//ancestor::tr/td"
f"[normalize-space()='Available']", driver)
def test_delete_volume_demo(login, driver, volume_name,