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:
parent
db1859f74e
commit
6f3a2f7c85
|
@ -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')
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue