def __init__(self, parent=None): self.delete = Button( xpath="//div[@id='content']" "//button[contains(@class, 'delete-cluster-btn')]", element_name="Delete") AbstractView.__init__(self, parent)
def __init__(self): self.stay_on_page_btn = Button( xpath=".//button[@class='btn btn-return']", element_name="Stay on page button") self.leave_page_discard_changes_button = Button( xpath=".//button[@class='btn btn-danger proceed-btn']", element_name="Leave page and discard changes button")
class AbstractDialog(AbstractView): XPATH_DIALOG = "/html/body/div[contains(@class,'modal ')]" BUTTON_APPLY = "Apply" BUTTON_CREATE = "Create" BUTTON_CANCEL = "Cancel" BUTTON_DELETE = "Delete" BUTTON_DEPLOY = "Deploy" def __init__(self): self.wait_loading() self.elementClose = Button( xpath="./div[@class='modal-header']/button[@class='close']", element_name="Dialog [x] header icon" ) self.footerButton = Button( xpath="./div[@class='modal-footer']/button[contains(.,'{name}')]", element_name="Dialog footer button [{name}]" ) AbstractView.__init__(self, self.__get_control_dialog()) @classmethod def __get_control_dialog(cls): return cls.get_wait_bot().wait_for_web_element( By.XPATH, cls.XPATH_DIALOG) def apply(self): return self.click_footer_button(self.BUTTON_APPLY) def cancel(self): return self.click_footer_button(self.BUTTON_CANCEL) def click_footer_button(self, name): res = self.footerButton.find(name=name).click_and_wait() self.wait_closing() return res def close(self): return self.elementClose.click_and_wait() def create(self): return self.click_footer_button(self.BUTTON_CREATE) def delete(self): return self.click_footer_button(self.BUTTON_DELETE) def deploy(self): return self.click_footer_button(self.BUTTON_DEPLOY) def wait_closing(self): self.get_wait_bot().wait_for_disappears(By.XPATH, self.XPATH_DIALOG) self.get_wait_bot().wait_loading() def wait_loading(self): self.get_wait_bot().wait_for_stop_moving(By.XPATH, self.XPATH_DIALOG) self.get_wait_bot().wait_loading()
def __init__(self, parent=None): self.applyButton = Button( xpath=".//button[contains(@class, 'btn-apply')]", element_name="Apply") self.cancelButton = Button( xpath=".//button[contains(@class, 'btn-discard')]", element_name="Cancel") BasePage.__init__(self, parent)
def __init__(self, parent=None): self.applyButton = Button( xpath=".//button[contains(@class, 'btn-apply')]", element_name="Apply" ) self.cancelButton = Button( xpath=".//button[contains(@class, 'btn-discard')]", element_name="Cancel" ) BasePage.__init__(self, parent)
def __init__(self): self.wait_loading() self.elementClose = Button( xpath="./div[@class='modal-header']/button[@class='close']", element_name="Dialog [x] header icon") self.footerButton = Button( xpath=".//div[contains(@class,'modal-footer')]" "/button[contains(.,'{name}')]", element_name="Dialog footer button [{name}]") AbstractView.__init__(self, self.__get_control_dialog())
def __init__(self): self.wait_loading() self.elementClose = Button( xpath="./div[@class='modal-header']/button[@class='close']", element_name="Dialog [x] header icon" ) self.footerButton = Button( xpath="./div[@class='modal-footer']/button[contains(.,'{name}')]", element_name="Dialog footer button [{name}]" ) AbstractView.__init__(self, self.__get_control_dialog())
class ConfirmLeavePageDialog(AbstractDialog): def __init__(self): self.stay_on_page_btn = Button( xpath=".//button[@class='btn btn-return']", element_name="Stay on page button") self.leave_page_discard_changes_button = Button( xpath=".//button[@class='btn btn-danger proceed-btn']", element_name="Leave page and discard changes button") def click_stay_on_page(self): return self.stay_on_page_btn.click_and_wait() def click_leave_page(self): return self.leave_page_discard_changes_button.click_and_wait()
def __init__(self): self.configure = Button( xpath="./tbody/tr[{row}]/td[{column}]/button", element_name="Configure" ) self.progress = HtmlElement( xpath="./tbody/tr[{row}]/td[{column}]" "//div[contains(@class, 'progress')]", element_name="progress bar" ) Table.__init__(self, HtmlElement( xpath=".//table[contains(@class, 'releases-table')]", element_name="Releases table" ).get_element())
def __init__(self): self.cancelChanges = Button( xpath="//button[contains(@class, 'btn-revert-changes')]", element_name="Cancel Changes") self.loadDefaults = Button( xpath="//button[contains(@class, 'btn-defaults')]", element_name="Load Changes") self.backToNodeList = Button( xpath="//button[contains(@class, 'btn-return')]", element_name="Back To Node List") AbstractView.__init__(self)
def __init__(self, parent=None): self.tab = HtmlElement( xpath="//div[@id='content']//ul[contains(@class, 'nav nav-tabs')]" "/li/a[b[@class='{}']]", element_name="Tab" ) self.deployChanges = Button( xpath="//button[contains(@class, 'deploy-btn')]", element_name="Deploy Changes" ) self.deploymentBar = HtmlElement( xpath="//li[contains(@class, 'deployment-control')]" "//div[contains(@class, 'progress-deploy')]", element_name="Deployment progress") self.successMessage = HtmlElement( xpath="//div[contains(@class, 'global-success')]/p", element_name="Success message" ) self.errorMessage = HtmlElement( xpath="//div[contains(@class, 'global-error')]/p", element_name="Error message" ) AbstractView.__init__(self, parent)
def __init__(self, parent=None): self.ip_range_start = Input(xpath=".//input[@name='ip_ranges-start']", element_name="Ip range start") self.ip_range_end = Input(xpath=".//input[@name='ip_ranges-end']", element_name="Ip range end") self.ip_range_add = Button( xpath=".//button[contains(@class,'ip-ranges-add')]", element_name="Ip range add") self.ip_range_delete = Button( xpath=".//button[contains(@class,'ip-ranges-delete')]", element_name="Ip range delete") BasePage.__init__(self, parent)
class AbstractView(BasePage): def __init__(self, parent=None): self.applyButton = Button( xpath=".//button[contains(@class, 'btn-apply')]", element_name="Apply") self.cancelButton = Button( xpath=".//button[contains(@class, 'btn-discard')]", element_name="Cancel") BasePage.__init__(self, parent) def apply(self): return self.applyButton.click() def cancel(self): return self.cancelButton.click_and_wait()
def __init__(self, parent=None): self.delete = Button( xpath="//div[@id='content']" "//button[contains(@class, 'delete-cluster-btn')]", element_name="Delete" ) AbstractView.__init__(self, parent)
def __init__(self, parent=None): self.addCompute = Link( xpath="//div[@id='tab-nodes']" "//div[contains(@class, 'node-list-compute')]" "//a[contains(@class, 'btn-add-nodes')]", element_name="Add compute" ) self.addController = Link( xpath="//div[@id='tab-nodes']" "//div[contains(@class, 'node-list-controller')]" "//a[contains(@class, 'btn-add-nodes')]", element_name="Add controller" ) self.addCinder = Link( xpath="//div[@id='tab-nodes']" "//div[contains(@class, 'node-list-cinder')]" "//a[contains(@class, 'btn-add-nodes')]", element_name="Add controller" ) self.computes = Button( xpath="//div[@id='tab-nodes']" "//div[contains(@class, 'node-list-compute')]", element_name="computes" ) self.controllers = HtmlElement( xpath="//div[@id='tab-nodes']" "//div[contains(@class, 'node-list-controller')]", element_name="controllers" ) self.cinders = Button( xpath="//div[@id='tab-nodes']" "//div[contains(@class, 'node-list-cinder')]", element_name="cinders" ) self.deploymentMode = Link( xpath="//li[contains(@class, 'change-cluster-mode-btn')]", element_name="Deployment mode" ) self.alertError = HtmlElement( xpath="//div[contains(@class, 'alert-block') " "and contains(@class, 'global-error')]/p", element_name="Alert Error" ) AbstractView.__init__(self, parent)
class AbstractView(BasePage): def __init__(self, parent=None): self.applyButton = Button( xpath=".//button[contains(@class, 'btn-apply')]", element_name="Apply" ) self.cancelButton = Button( xpath=".//button[contains(@class, 'btn-discard')]", element_name="Cancel" ) BasePage.__init__(self, parent) def apply(self): return self.applyButton.click() def cancel(self): return self.cancelButton.click_and_wait()
class Releases_Table(Table): def __init__(self): self.configure = Button( xpath="./tbody/tr[{row}]/td[{column}]/button", element_name="Configure" ) self.progress = HtmlElement( xpath="./tbody/tr[{row}]/td[{column}]" "//div[contains(@class, 'progress')]", element_name="progress bar" ) Table.__init__(self, HtmlElement( xpath=".//table[contains(@class, 'releases-table')]", element_name="Releases table" ).get_element()) def get_release_row(self, release_name): return self.get_row(1, release_name) def get_release_status(self, release_name): return self.get_value(self.get_release_row(release_name), 3) def click_configure(self, release_name): return self.configure.find( row=self.get_row(1, release_name), column=4 ).click() def verify_releases_count(self, count): return self.get_verify_bot().verify_equal( count, self.get_rows_count(), "Releases table", "rows count" ) def verify_release_status(self, release_name, status): return self.get_verify_bot().verify_equal( expected=status, actual=self.get_release_status(release_name), name=release_name, _type="status" ) def wait_downloading(self, release_name): rl = ResultList( "Wait release downloading done: {}".format(release_name)) row = self.get_release_row(release_name=release_name) rl.push(self.progress.find(row=row, column=3).verify_visible(True)) rl.info("Release download started") if self.get_wait_bot().wait_for_web_element_disappears( web_element=self.progress.get_element(), timeout=20, poll_frequency=3) is not None: rl.info("Release download done") else: rl.push(Result("Release download failed on timeout", False)) return rl
def __init__(self, parent=None): self.checkbox_role = Checkbox( xpath="//input[@type='checkbox' and @value='{role}']", element_name="Checkbox '{role}'") self.assign = Button( xpath=".//button[@class='btn btn-success btn-assign']", element_name="Assign button") self.conflict_role = HtmlElement( xpath=".//div[@class='role-conflict '{role}'']", element_name="Conflict '{role}'") AbstractView.__init__(self, parent)
class Cluster_Actions_View(AbstractView): def __init__(self, parent=None): self.delete = Button( xpath="//div[@id='content']" "//button[contains(@class, 'delete-cluster-btn')]", element_name="Delete") AbstractView.__init__(self, parent) def click_delete_cluster_button(self): return self.delete.click()
class Cluster_Actions_View(AbstractView): def __init__(self, parent=None): self.delete = Button( xpath="//div[@id='content']" "//button[contains(@class, 'delete-cluster-btn')]", element_name="Delete" ) AbstractView.__init__(self, parent) def click_delete_cluster_button(self): return self.delete.click()
def __init__(self, parent=None): self.tab = HtmlElement( xpath="//div[@id='content']//ul[contains(@class, 'nav nav-tabs')]" "/li/a[b[@class='{}']]", element_name="Tab") self.deployChanges = Button( xpath="//button[contains(@class, 'deploy-btn')]", element_name="Deploy Changes") self.deploymentBar = HtmlElement( xpath="//li[contains(@class, 'deployment-control')]" "//div[contains(@class, 'progress-deploy')]", element_name="Deployment progress") self.successMessage = HtmlElement( xpath="//div[contains(@class, 'global-success')]/p", element_name="Success message") self.errorMessage = HtmlElement( xpath="//div[contains(@class, 'global-error')]/p", element_name="Error message") AbstractView.__init__(self, parent)
def __init__(self, parent=None): self.addNodes = Link( xpath="//div//a[@class='btn btn-success btn-add-nodes']", element_name="Add nodes" ) self.deleteNodes = Button( xpath="//button[contains(@class,'btn-delete-nodes')]", element_name="Delete nodes" ) self.reassignRoles = Button( xpath="//button[contains(@class, 'btn-assign-roles')]" "and contains(text(),'Reassign Roles')]", element_name="Reassign roles" ) self.assignRoles = Button( xpath="//button[contains(" "@class, 'btn btn-success btn-assign-roles') " "and contains(text(),'Assign Roles')]", element_name="Assign roles" ) self.environment_status = HtmlElement( xpath="//div[@class='environment-status']", element_name="Environment status" ) self.groupBy = Select( xpath="//div[@class='cluster-toolbar-item nodes-filter']" "//select[@name='grouping']", element_name="Select group by" ) self.backToEnvironmentNodeList = Button( xpath="//div[@class='btn btn-go-to-cluster']", element_name="Back to Environment Node List" ) self.nodelist = HtmlElement( xpath="//div[@class='node-groups' and " "contains(div[@class='row-fluid node-group-header']" "//h4/text(),'{role}')]", element_name="'{role}' block" ) self.deploymentMode = Button( xpath="//button[contains(@class,'btn btn-cluster-actions')]", element_name="Deployment mode" ) self.alertError = HtmlElement( xpath="//div[contains(@class, 'alert-block') " "and contains(@class, 'global-error')]/p", element_name="Alert Error" ) AbstractView.__init__(self, parent)
class Cluster_View(AbstractView): def __init__(self, parent=None): self.tab = HtmlElement( xpath="//div[@id='content']//ul[contains(@class, 'nav nav-tabs')]" "/li[.//b[@class='{}']]", element_name="Tab" ) self.deployChanges = Button( xpath="//button[contains(@class, 'deploy-btn')]", element_name="Deploy Changes" ) self.deploymentBar = HtmlElement( xpath="//li[contains(@class, 'deployment-control')]" "//div[contains(@class, 'progress-deploy')]", element_name="Deployment progress") self.successMessage = HtmlElement( xpath="//div[contains(@class, 'global-success')]/p", element_name="Success message" ) AbstractView.__init__(self, parent) def click_actions_tab(self): return ResultList("Click actions tab") \ .push(self.tab.find("tab-actions-normal").click()) def click_deploy_changes(self): return self.deployChanges.click() def wait_deployment_done(self, seconds): return Result( "Wait for deployment done ({})".format(seconds), WaitBot(seconds).wait_for_disappears( By.XPATH, "//li[contains(@class, 'deployment-control')]" "//div[contains(@class, 'progress-deploy')] " ) ) def verify_success_message(self, value): return self.successMessage.verify_value_contains(value)
def __init__(self, parent=None): self.caption = HtmlElement( xpath=".//div[contains(@class,'disk-box-name')]", element_name="Caption") self.total_space = HtmlElement( xpath=".//div[contains(@class,'disk-box-size')]", element_name="Total space") self.bootable_marker = HtmlElement( xpath=".//div[contains(@class,'disk-box-name')]/span", element_name="Disk's bootable marker") self.volume_group = HtmlElement( xpath=".//div[contains(@class,'volume-group') and " ".//div[@class='volume-group-name']='{name}']", element_name="Volume group {name}") self.disk_parameter = HtmlElement( xpath=".//div[contains(@class,'disk-map-details-item')]", element_name="Disk parameter {name}") self.disk_map_details = HtmlElement( xpath=".//div[contains(@class,'disk-map-details-item') and " "div[@class='disk-map-details-name']='{name}']/" "div[@class='disk-map-details-parameter']", element_name="Disk parameter {name}") self.volume_group_box = HtmlElement( xpath=".//div[contains(@class,'volume-group-box') and " "div[@class='volume-group-box-name']='{name}']", element_name="Volume group box {name}") self.make_bootable = Button(xpath=".//button[text()='Make Bootable']", element_name="Make Bootable") self.disk_map = HtmlElement( xpath=".//div[@class='disk-map-short disk-map-full']", element_name="Disk map") BasePage.__init__(self, parent)
def __init__(self, parent=None): self.log_node = Select( xpath=".//div[contains(@class,'log-type-filter')]/select", element_name="Logs") self.source = Select( xpath=".//div[contains(@class,'log-source-filter')]/select", element_name="Source") self.level = Select( xpath=".//div[contains(@class,'log-level-filter')]/select", element_name="Min. level") self.show_button = Button( xpath=".//button[contains(@class,'show-logs-btn')]", element_name="Show") self.table_logs = HtmlElement( xpath=".//table[contains(@class,'table-logs')]", element_name="Logs table") AbstractView.__init__(self, parent)
def __init__(self, parent=None): self.save_settings = Button( xpath=".//button[contains(@class, 'btn-apply-changes')]", element_name="Save Settings") self.cancel_changes = Button( xpath=".//button[contains(@class, 'btn-revert-changes')]", element_name="Cancel Changes") self.load_defaults = Button( xpath=".//button[contains(@class, 'btn btn-load-defaults')]", element_name="Load Defaults") self.parameter_input = Input( xpath=".//label[contains(@class,'parameter-box') and " "div[contains(@class,'parameter-name')]='{name}']//" "input[@type='text']", element_name="Parameter {name}") self.parameter_radio = Radio( xpath=".//label[contains(@class,'parameter-box') and " "div[contains(@class,'parameter-name')]='{name}']", element_name="Parameter {name}") self.parameter_checkbox = Checkbox( xpath=".//label[contains(@class,'parameter-box') and " "div[contains(@class,'parameter-name')]='{name}']//" "input[@type='checkbox']", element_name="Parameter {name}") self.show_password = Button( xpath=".//span[@class='add-on' " "and i[contains(@class, 'icon-eye')]]", element_name="Show password button") self.show_password_on = Button( xpath=".//i[@class ='icon-eye' and @style='display: inline;']", element_name="Show password button") self.show_password_off = Button( xpath=".//i[@class ='icon-eye-off hide' " "and @style='display: inline;']", element_name="Show password button") AbstractView.__init__(self, parent)
class Cluster_Nodes_View(AbstractView): def __init__(self, parent=None): self.addNodes = Link( xpath="//div//a[@class='btn btn-success btn-add-nodes']", element_name="Add nodes" ) self.deleteNodes = Button( xpath="//button[contains(@class,'btn-delete-nodes')]", element_name="Delete nodes" ) self.reassignRoles = Button( xpath="//button[contains(@class, 'btn-assign-roles')]" "and contains(text(),'Reassign Roles')]", element_name="Reassign roles" ) self.assignRoles = Button( xpath="//button[contains(" "@class, 'btn btn-success btn-assign-roles') " "and contains(text(),'Assign Roles')]", element_name="Assign roles" ) self.environment_status = HtmlElement( xpath="//div[@class='environment-status']", element_name="Environment status" ) self.groupBy = Select( xpath="//div[@class='cluster-toolbar-item nodes-filter']" "//select[@name='grouping']", element_name="Select group by" ) self.backToEnvironmentNodeList = Button( xpath="//div[@class='btn btn-go-to-cluster']", element_name="Back to Environment Node List" ) self.nodelist = HtmlElement( xpath="//div[@class='node-groups' and " "contains(div[@class='row-fluid node-group-header']" "//h4/text(),'{role}')]", element_name="'{role}' block" ) self.deploymentMode = Button( xpath="//button[contains(@class,'btn btn-cluster-actions')]", element_name="Deployment mode" ) self.alertError = HtmlElement( xpath="//div[contains(@class, 'alert-block') " "and contains(@class, 'global-error')]/p", element_name="Alert Error" ) AbstractView.__init__(self, parent) def click_deployment_mode(self): return self.deploymentMode.click() @catch_stale_error def click_add_nodes(self): return self.addNodes.click_and_wait() def select_environment_mode(self, deploymentMode): rl = ResultList( "Select environment mode [{mode}]".format( mode=deploymentMode) ) rl.push(self.click_deployment_mode()) rl.push(CreateEnvironmentDialog().select_deployment_mode( deploymentMode )) rl.push(CreateEnvironmentDialog().clickNext()) return rl @catch_stale_error def verify_nodes(self, role, nodes): return Cluster_Nodes_ListView( self.nodelist.find(role=role).get_element() ).verify_nodes(*nodes) def get_nodes(self, role): return Cluster_Nodes_ListView( self.nodelist.find(role=role).get_element()).get_nodes() def verify_node_with_role_not_exists(self, role, *args): return Cluster_Nodes_ListView( self.nodelist.find(role=role).get_element() ).verify_nodes_not_exist(*args) def verify_error_contains(self, *args): rl = ResultList("Verify error alert contains") for string in args: rl.push(Result( "String [{string}] exists".format(string=string), self.alertError.get_value().find(string) != -1 )) return rl def verify_nodelists_visibility(self, value, *roles): rl = ResultList("Verify node lists visibility") for role in roles: rl.push(VerifyBot().verify_visibility( self.nodelist.find(role=role).get_element(), value, "'{role}' nodelist")) return rl def verify_amount(self, elements_role, value): result = None try: elements = self.get_nodes(role=elements_role) if value == 0: result = Result( "Verify if amount of {role} is 0".format( role=elements_role, value=value), VerifyBot().verify_visibility( elements, False, elements_role).i_passed()) else: result = Result( "Verify if amount of {role} is {value}".format( role=elements_role, value=value), len(elements) == value) except ElementNotFoundException: if value == 0: result = Result("There are no {name}".format( role=elements_role), True) return result def select_nodes(self, *args): rl = ResultList("Select nodes") for name in args: node = Node(Cluster_Nodes_ListView().node.find( name=name).get_element()) rl.push(node.select()) return rl def select_roles(self, *roles): rl = ResultList("Select roles") for role in roles: rl.push(RolesPanel().checkbox_role.find(role=role).set_value('on')) return rl def assign_roles_to_nodes(self, roles, node_names): rl = ResultList("Select nodes and assign roles") rl.push(self.select_nodes(*node_names)) rl.push(self.select_roles(*roles)) rl.push(self.apply()) ActionBot().wait_for_time(2) return rl def delete_nodes(self, *args): rl = ResultList("Delete nodes") rl.push(self.select_nodes(*args)) rl.push(self.deleteNodes.click_and_wait()) rl.push(DeleteNodeDialog().delete()) return rl
class Cluster_View(AbstractView): def __init__(self, parent=None): self.tab = HtmlElement( xpath="//div[@id='content']//ul[contains(@class, 'nav nav-tabs')]" "/li/a[b[@class='{}']]", element_name="Tab" ) self.deployChanges = Button( xpath="//button[contains(@class, 'deploy-btn')]", element_name="Deploy Changes" ) self.deploymentBar = HtmlElement( xpath="//li[contains(@class, 'deployment-control')]" "//div[contains(@class, 'progress-deploy')]", element_name="Deployment progress") self.successMessage = HtmlElement( xpath="//div[contains(@class, 'global-success')]/p", element_name="Success message" ) self.errorMessage = HtmlElement( xpath="//div[contains(@class, 'global-error')]/p", element_name="Error message" ) AbstractView.__init__(self, parent) def click_actions_tab(self): return ResultList("Click actions tab") \ .push(self.tab.find("tab-actions-normal").click_and_wait()) def click_logs_tab(self): return ResultList("Click logs tab") \ .push(self.tab.find("tab-logs-normal").click_and_wait()) def click_network_settings_tab(self): return ResultList("Click network settings tab") \ .push(self.tab.find("tab-network-normal").click_and_wait()) def click_openstack_settings_tab(self): return ResultList("Click OpenStack settings tab")\ .push(self.tab.find("tab-settings-normal").click_and_wait()) def click_deploy_changes(self): return self.deployChanges.click() def wait_deployment_done(self, seconds, poll_frequency=5): return Result( "Wait for deployment done ({})".format(seconds), WaitBot(seconds).wait_for_disappears( By.XPATH, "//li[contains(@class, 'deployment-control')]" "//div[contains(@class, 'progress-deploy')] ", poll_frequency=poll_frequency ) ) def verify_success_message(self, value): return self.successMessage.verify_value_contains(value) def verify_successful_deployment_per_name(self, name): return self.verify_success_message( "Deployment of environment '{name}' is done." " Access the OpenStack dashboard (Horizon) at" .format(name=name) ) def verify_error_message(self, value): return self.errorMessage.verify_value_contains(value)
class Cluster_View(AbstractView): def __init__(self, parent=None): self.tab = HtmlElement( xpath="//div[@id='content']//ul[contains(@class, 'nav nav-tabs')]" "/li/a[b[@class='{}']]", element_name="Tab") self.deployChanges = Button( xpath="//button[contains(@class, 'deploy-btn')]", element_name="Deploy Changes") self.deploymentBar = HtmlElement( xpath="//li[contains(@class, 'deployment-control')]" "//div[contains(@class, 'progress-deploy')]", element_name="Deployment progress") self.successMessage = HtmlElement( xpath="//div[contains(@class, 'global-success')]/p", element_name="Success message") self.errorMessage = HtmlElement( xpath="//div[contains(@class, 'global-error')]/p", element_name="Error message") AbstractView.__init__(self, parent) def click_actions_tab(self): return ResultList("Click actions tab") \ .push(self.tab.find("tab-actions-normal").click_and_wait()) def click_logs_tab(self): return ResultList("Click logs tab") \ .push(self.tab.find("tab-logs-normal").click_and_wait()) def click_network_settings_tab(self): return ResultList("Click network settings tab") \ .push(self.tab.find("tab-network-normal").click_and_wait()) def click_openstack_settings_tab(self): return ResultList("Click OpenStack settings tab")\ .push(self.tab.find("tab-settings-normal").click_and_wait()) def click_deploy_changes(self): return self.deployChanges.click() def wait_deployment_done(self, seconds, poll_frequency=5): return Result( "Wait for deployment done ({})".format(seconds), WaitBot(seconds).wait_for_disappears( By.XPATH, "//li[contains(@class, 'deployment-control')]" "//div[contains(@class, 'progress-deploy')] ", poll_frequency=poll_frequency)) def verify_success_message(self, value): return self.successMessage.verify_value_contains(value) def verify_successful_deployment_per_name(self, name): return self.verify_success_message( "Deployment of environment '{name}' is done." " Access the OpenStack dashboard (Horizon) at".format(name=name)) def verify_error_message(self, value): return self.errorMessage.verify_value_contains(value)
class AbstractDialog(AbstractView): XPATH_DIALOG = "/html/body/div[contains(@class,'modal ')]" BUTTON_APPLY = "Apply" BUTTON_CREATE = "Create" BUTTON_CANCEL = "Cancel" BUTTON_DELETE = "Delete" BUTTON_DEPLOY = "Deploy" BUTTON_NEXT = "Next >" BUTTON_PREV = "< Prev" def __init__(self): self.wait_loading() self.elementClose = Button( xpath="./div[@class='modal-header']/button[@class='close']", element_name="Dialog [x] header icon") self.footerButton = Button( xpath=".//div[contains(@class,'modal-footer')]" "/button[contains(.,'{name}')]", element_name="Dialog footer button [{name}]") AbstractView.__init__(self, self.__get_control_dialog()) @classmethod def __get_control_dialog(cls): return cls.get_wait_bot().wait_for_web_element(By.XPATH, cls.XPATH_DIALOG) def apply(self): return self.click_footer_button(self.BUTTON_APPLY) def cancel(self): return self.click_footer_button(self.BUTTON_CANCEL) def click_footer_button(self, name, wait_closing=True): res = self.footerButton.find(name=name).click_and_wait() if wait_closing: self.wait_closing() return res def close(self): return self.elementClose.click_and_wait() def create(self): return self.click_footer_button(self.BUTTON_CREATE) def delete(self): return self.click_footer_button(self.BUTTON_DELETE) def deploy(self): return self.click_footer_button(self.BUTTON_DEPLOY) def deploy_button(self): return self.footerButton.find(name=self.BUTTON_DEPLOY) def clickNext(self, wait_closing=False): return self.click_footer_button(self.BUTTON_NEXT, wait_closing) def clickPrev(self): return self.click_footer_button(self.BUTTON_PREV, False) def wait_closing(self): self.get_wait_bot().wait_for_disappears(By.XPATH, self.XPATH_DIALOG) self.get_wait_bot().wait_loading() def wait_loading(self): self.get_wait_bot().wait_for_stop_moving(By.XPATH, self.XPATH_DIALOG) self.get_wait_bot().wait_for_stop_resizing(By.XPATH, self.XPATH_DIALOG) self.get_wait_bot().wait_loading()
def __init__(self, parent=None): self.save_settings = Button( xpath=".//div[contains(@class, 'apply-btn')]", element_name="Save Settings") self.cancel_changes = Button( xpath=".//div[contains(@class, 'btn-revert-changes')]", element_name="Cancel Changes") self.verify_networks = Button( xpath=".//div[contains(@class, 'verify-networks-btn')]", element_name="Verify networks") self.flat_dhcp_manager = Radio(xpath=".//div[@class='custom-tumbler' " "and input[@value='FlatDHCPManager']]", element_name="FlatDHCP Manager") self.vlan_manager = Radio(xpath=".//div[@class='custom-tumbler' " "and input[@value='VlanManager']]", element_name="Vlan Manager") self.ip_range_row = HtmlElement( xpath=".//div[@class='{name}']/" "div[contains(@class,'range-row ')][{num}]", element_name="Range row {name} [{num}]") self.public_vlan_id = Input( xpath=".//input[@name='public-vlan_start']", element_name="Public VLAN ID") self.public_netmask = Input(xpath=".//input[@name='public-netmask']", element_name="Public Netmask") self.public_gateway = Input(xpath=".//input[@name='public-gateway']", element_name="Public Gateway") self.management_cidr = Input(xpath=".//input[@name='management-cidr']", element_name="Management CIDR") self.management_vlan_id = Input( xpath=".//input[@name='management-vlan_start']", element_name="Management VLAN ID") self.storage_cidr = Input(xpath=".//input[@name='storage-cidr']", element_name="Storage CIDR") self.storage_vlan_id = Input( xpath=".//input[@name='storage-vlan_start']", element_name="Storage VLAN ID") self.vm_networks_cidr = Input(xpath=".//input[@name='fixed-cidr']", element_name="VM Networks CIDR") self.vm_networks_vlan_id = Input( xpath=".//input[@name='fixed-vlan_start']", element_name="VM Networks VLAN ID") self.vm_networks_vlan_id_range_start = Input( xpath=".//input[@name='fixed-vlan_range-start']", element_name="VM Networks VLAN ID range start") self.vm_networks_vlan_id_range_end = Input( xpath=".//input[@name='fixed-vlan_range-end']", element_name="VM Networks VLAN ID range end") self.vm_networks_number_of_networks = Input( xpath=".//input[@name='fixed-amount']", element_name="VM Networks. Number of networks") self.vm_networks_size_of_networks = Select( xpath=".//select[@name='fixed-network_size']", element_name="VM Networks. Size of networks") self.verify_networks = Button( xpath=".//button[contains(@class,'verify-networks-btn')]", element_name="Verify networks") self.cancel_changes = Button( xpath=".//button[contains(@class, 'btn-revert-changes')]", element_name="Cancel changes") self.save_settings = Button( xpath=".//button[contains(@class, 'btn-success apply-btn')]", element_name="Save settings") AbstractView.__init__(self, parent)
class Cluster_Nodes_View(AbstractView): def __init__(self, parent=None): self.addCompute = Link( xpath="//div[@id='tab-nodes']" "//div[contains(@class, 'node-list-compute')]" "//a[contains(@class, 'btn-add-nodes')]", element_name="Add compute" ) self.addController = Link( xpath="//div[@id='tab-nodes']" "//div[contains(@class, 'node-list-controller')]" "//a[contains(@class, 'btn-add-nodes')]", element_name="Add controller" ) self.addCinder = Link( xpath="//div[@id='tab-nodes']" "//div[contains(@class, 'node-list-cinder')]" "//a[contains(@class, 'btn-add-nodes')]", element_name="Add controller" ) self.computes = Button( xpath="//div[@id='tab-nodes']" "//div[contains(@class, 'node-list-compute')]", element_name="computes" ) self.controllers = HtmlElement( xpath="//div[@id='tab-nodes']" "//div[contains(@class, 'node-list-controller')]", element_name="controllers" ) self.cinders = Button( xpath="//div[@id='tab-nodes']" "//div[contains(@class, 'node-list-cinder')]", element_name="cinders" ) self.deploymentMode = Link( xpath="//li[contains(@class, 'change-cluster-mode-btn')]", element_name="Deployment mode" ) self.alertError = HtmlElement( xpath="//div[contains(@class, 'alert-block') " "and contains(@class, 'global-error')]/p", element_name="Alert Error" ) AbstractView.__init__(self, parent) def click_add_compute(self): return self.addCompute.click_and_wait() def click_add_controller(self): return self.addController.click_and_wait() def click_add_cinder(self): return self.addCinder.click_and_wait() def click_deployment_mode(self): return self.deploymentMode.click() def select_environment_mode(self, deploymentMode): rl = ResultList( "Select environment mode [{mode}]".format( mode=deploymentMode) ) rl.push(self.click_deployment_mode()) rl.push(EnvironmentDeploymentModeDialog().populate( deploymentMode=deploymentMode, submit=True )) return rl def verify_cinder_nodes(self, *args): return Cluster_Nodes_ListView( self.cinders.get_element() ).verify_nodes(*args) def verify_compute_nodes(self, *args): return Cluster_Nodes_ListView( self.computes.get_element() ).verify_nodes(*args) def verify_controller_nodes(self, *args): return Cluster_Nodes_ListView( self.controllers.get_element() ).verify_nodes(*args) def get_nodes_controllers(self): return Cluster_Nodes_ListView(self.controllers.get_element())\ .get_nodes() def get_nodes_computes(self): return Cluster_Nodes_ListView(self.computes.get_element())\ .get_nodes() def get_nodes_cinders(self): return Cluster_Nodes_ListView(self.cinders.get_element())\ .get_nodes() def verify_error_contains(self, *args): rl = ResultList("Verify error alert contains") for string in args: rl.push(Result( "String [{string}] exists".format(string=string), self.alertError.get_value().find(string) != -1 )) return rl