Selenium Python单击一个元素,网页会在捕获错误的屏幕截图时发生错误

时间:2016-03-19 19:04:59

标签: python-2.7 selenium selenium-webdriver

我知道如何捕获Selenium Python中的截图,但何时捕获它? 把它放在代码中的哪个位置。 我的场景:我的selenium脚本点击了网页上的一个元素(一个按钮),并显示了一个错误对话框。由于错误对话框,我的测试方法无法继续。 然后脚本转到下一个测试方法,这很好。

如果在点击元素时出现错误,我想捕获屏幕截图 在单击事件上,可能会出现错误对话框,可能会出现404错误页面等。

目前我有一个自定义方法,可以找到一个元素,并在找不到该元素时捕获屏幕截图 我的find_element方法是:

# returns the element if found
def get_element(self, how, what):
    # params how: By locator type
    # params what: locator value
    try:
        element = self.driver.find_element(by=how, value=what)
    except NoSuchElementException, e:
        print what
        print "Element not found "
        print e
        screenshot_name = how + what + get_datetime_now() # create screenshot name of the name of the element + locator + todays date time.  This way the screenshot name will be unique and be able to save
        self.save_screenshot(screenshot_name)
        raise
    return element

def save_screenshot(self, name):
    self.driver.save_screenshot(os.path.join(Globals.screenshots_folder, name + '.png'))
    return self

如果在单击元素时出现错误页面或错误对话框,如何捕获屏幕截图?

当驱动程序关闭时,我是否还应该在拆卸方法中捕获屏幕截图? 如果在拆除过程中有什么错误插入捕获屏幕截图?

谢谢, 里亚兹

我的解决方案: 我展示了答案,Andrew Regan对我同事的评论,他建议将try / catch块放在测试用例的每个测试方法周围。 我是按照以下方式完成的。我在测试方法下面的代码片段:

def test_00001_add_all_records_report_CRM(self):
    try:
        print "*** Test add_all_records_report - CRM ***"
        self.login_page.userLogin_valid(Globals.login_username, Globals.login_password)
        tool_bar = ToolbarPage(self.driver)
        tool_bar.select_project_from_drop_down2("Analysis") 
        menu_bar = MenuBarPage(self.driver)
        reporting_page = menu_bar.select_menuBar_item("Reporting")
        project_navigator = ProjectNavigatorPage(self.driver)
        reports_page = project_navigator.select_projectNavigator_item("Reports")
        reports_page.click_add_button_for_reports()
        reports_manual_tab = reports_page.click_manual_tab()
        reports_manual_tab.enter_name_and_description_for_the_report_from_details_section("all_records", "This is an all records report")
        reports_manual_tab.click_type_dropdown_from_details_section("USN entities")
        reports_manual_tab.click_USN_category_link()
        reports_manual_tab.click_an_entity_from_usn_category_drop_down("All entities")
        reports_manual_tab.click_datasets_link()
        reports_manual_tab.uncheck_all_datasets_checkboxes() # untick all datasets checkboxes so we can start from a clean slate
        reports_manual_tab.click_a_dataset_checkbox_from_datasets_section("CRM")
        reports_manual_tab.click_variables_link()
        reports_manual_tab.click_all_variables_checkboxes_from_variables_section()
        reports_manual_tab.click_fields_link()
        reports_manual_tab.click_a_field_checkbox_from_fields_section("SOURCE_FIELDS", "Name")
        reports_manual_tab.click_a_field_checkbox_from_fields_section("SOURCE_FIELDS", "Address")
        reports_manual_tab.click_a_field_checkbox_from_fields_section("SOURCE_FIELDS", "DOB")
        reports_manual_tab.click_right_arrow_to_move_fields_to_selected_fields_listbox_from_fields_section()
        reports_page.click_save()
        project_navigator.select_projectNavigator_item("Reports")             
        self.assertTrue(reports_page.is_report_details_saved("all_records", "This is an all records report", "USN entities"), "Problem with saved report. Please see log for details")
    except Exception:
        base_page = BasePage(self.driver)
        base_page.save_screenshot("test_00001_add_all_records_report_CRM")
        raise

当我的测试方法失败时,它确实创建了屏幕截图。我可以这样写吗?

1 个答案:

答案 0 :(得分:1)

这实际上是关于处理异常的正确方法 - 屏幕截图方面只是一个细节。

这是一个广泛的主题,但一个出发点是,就您的测试用例/套件而言,您应该将所有WebDriverExceptionNoSuchElementException的父级)视为致命错误。如果有更高级的需求并且更有信心,那么随意变得更加复杂,但这是最简单和最安全的方法。

在这种情况下,您应该尝试在get_element级别的方法中捕获任何这些异常,您应该让它们传播/冒泡到单个catch /最后阻止你的代码的顶层(注意。这应该在你的拆解代码中,这应该是你运行的所有测试/应用程序方法的包装。)

一旦你拥有了这个全能的处理程序,你可以在那里添加你的屏幕截图保存代码,你可以确信它将永远被调用,仅用于WebDriver错误(任何类型),然后只有一次。

这取决于您,但您无需尝试在拆卸中记录屏幕截图。从本质上说,这不是“真正的”代码,只是脚手架,所以诚实的堆栈跟踪就足够了。