Exemplo n.º 1
0
class TestParametrization(unittest.TestCase):
    """简单的unittest参数化"""
    url = ReadYaml(location.CONFIG_FILE).yaml_data()['URL']
    phonenumber = ReadYaml(os.path.join(
        location.DATA_PATH, 'logindata.yaml')).yaml_data()['username']
    password = ReadYaml(os.path.join(location.DATA_PATH,
                                     'logindata.yaml')).yaml_data()['password']
    param = list(zip(phonenumber, password))

    def setUp(self):
        self.driver = Driver().driver()
        self.driver.get(self.url)
        self.driver.maximize_window()

    @parameterized.expand(param)
    @unittest.skip("测试强制跳过")
    # 装饰器调用时从下往上,执行时从上往下
    def testLogin(self, username, password):
        """参数化测试登录"""
        LoginSys(self.driver, username, password).login()
        WebDriverWait(self.driver, 20, 0.5).until(
            ec.visibility_of_element_located(menu.MyWorkPanel))
        self.assertEqual(
            self.driver.find_element(*menu.MyWorkPanel).is_displayed(), True)

    def tearDown(self):
        self.driver.quit()
class MyTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = None
        cls.jscript_alerts_url = 'https://www.seleniumeasy.com/test/javascript-alert-box-demo.html'
        cls.jscript_alerts_title = 'Selenium Easy Demo - Automate All Scenarios'

        cls.jscript_alert_box_btn_xpath = '/html/body/div[2]/div/div[2]/div[1]/div[2]/button'
        cls.jscript_confirm_box_xpath = '/html/body/div[2]/div/div[2]/div[2]/div[2]/button'
        cls.configrm_demo_id = 'confirm-demo'
        cls.jscript_alert_box_prompt_xpath = '/html/body/div[2]/div/div[2]/div[3]/div[2]/button'
        cls.promt_demo_id = 'prompt-demo'

    def setUp(self):
        if self.driver is not None:
            self.driver.quit()

        self.driver = None

    def test_chrome(self):
        browser = 'chrome'
        self.generic_method(browser)

    def test_ie(self):
        browser = 'ie'
        self.generic_method(browser)

    def test_opera(self):
        browser = 'opera'
        self.generic_method(browser)

    def test_mozilla(self):
        browser = 'mozilla'
        self.generic_method(browser)

    def test_edge(self):
        browser = 'edge'
        self.generic_method(browser)

    def generic_method(self, browser):

        self.open_web_browser(browser)

        try:
            # Test Java Script Alert Box
            self.alert_box_testing()

            # Test Java Script Confirm Box
            self.confirm_box_testing()

            # Test Java Script Prompt Box
            self.prompt_box_testing()
        except WebDriverException as ec:
            self.screen_shot()
            raise

    def alert_box_testing(self):

        # Open Java Script Alert Box
        self.driver.find_element(By.XPATH,
                                 self.jscript_alert_box_btn_xpath).click()
        alert_box = WebDriverWait(self.driver, 15).until(
            expected_conditions.alert_is_present())

        # Verify alert box text and close the alert
        self.assertEqual('I am an alert box!', alert_box.text)
        time.sleep(1)
        alert_box.accept()

        # Back to the main window
        self.driver.switch_to.default_content()

    def confirm_box_testing(self):

        # Open Java Script Confirm Box
        self.driver.find_element(By.XPATH,
                                 self.jscript_confirm_box_xpath).click()
        confirm_box = WebDriverWait(self.driver, 15).until(
            expected_conditions.alert_is_present())

        # Verify text >>> Hit OK button
        self.assertTrue('Press a button!' in confirm_box.text)
        time.sleep(1)
        confirm_box.accept()

        # Verify the result
        self.driver.switch_to.default_content()
        self.assertEqual(
            'You pressed OK!',
            self.driver.find_element(By.ID, self.configrm_demo_id).text)
        time.sleep(1)

        # Open alert again
        self.driver.find_element(By.XPATH,
                                 self.jscript_confirm_box_xpath).click()
        confirm_box = WebDriverWait(self.driver, 15).until(
            expected_conditions.alert_is_present())

        # Verify text >>> Hit CANCEL button
        self.assertTrue('Press a button!' in confirm_box.text)
        time.sleep(1)
        confirm_box.dismiss()

        # Verify the result
        self.driver.switch_to.default_content()
        self.assertEqual(
            'You pressed Cancel!',
            self.driver.find_element(By.ID, self.configrm_demo_id).text)
        time.sleep(1)

    def prompt_box_testing(self):

        # Open prompt box and verify prompt text
        self.driver.find_element(By.XPATH,
                                 self.jscript_alert_box_prompt_xpath).click()
        prompt_box = WebDriverWait(self.driver, 15).until(
            expected_conditions.alert_is_present())
        self.assertEqual('Please enter your name', prompt_box.text)
        time.sleep(1)

        # Cancel it and verify the result
        prompt_box.dismiss()
        self.driver.switch_to.default_content()
        self.assertEqual(
            '',
            self.driver.find_element(By.ID, self.promt_demo_id).text)
        time.sleep(1)

        # Open prompt again
        self.driver.switch_to.default_content()
        self.driver.find_element(By.XPATH,
                                 self.jscript_alert_box_prompt_xpath).click()
        prompt_box = WebDriverWait(self.driver, 15).until(
            expected_conditions.alert_is_present())

        # Type name in prompt box
        time.sleep(1)
        prompt_box.send_keys('John Snow')
        time.sleep(1)

        # Accept it and verify text
        prompt_box.accept()
        self.driver.switch_to.default_content()
        self.assertEqual(
            'You have entered \'John Snow\' !',
            self.driver.find_element(By.ID, self.promt_demo_id).text)
        time.sleep(1)

    def open_web_browser(self, browser):

        try:
            # Launch webdriver on test web page + maximize window:
            self.driver = Driver(browser).get_driver()
            self.driver.maximize_window()
            self.driver.get(self.jscript_alerts_url)
            WebDriverWait(self.driver, 5).until(
                expected_conditions.title_is(self.jscript_alerts_title))

        except TimeoutException as ec:
            print('\n', ec)
            is_webpage_loaded = False
            while not is_webpage_loaded:
                is_webpage_loaded = True
                try:
                    if self.driver is not None:
                        self.driver.quit()

                    self.driver = Driver(browser).get_driver()
                    self.driver.maximize_window()
                    self.driver.get(self.jscript_alerts_url)

                    WebDriverWait(self.driver, 5).until(
                        expected_conditions.title_is(
                            self.jscript_alerts_title))
                except TimeoutException as ec:
                    print('\n', ec)
                    is_webpage_loaded = False

        finally:
            # Verify URL + Title
            self.assertEqual(self.jscript_alerts_url, self.driver.current_url)
            self.assertEqual(self.jscript_alerts_title, self.driver.title)

    def screen_shot(self):
        """Take a Screen-shot of the webpage when test Failed."""
        now = datetime.datetime.now()
        filename = 'screenshot-{}-{}.png'.format(
            self.driver.name,
            datetime.datetime.strftime(now, '%Y-%m-%d_%H-%M-%S'))
        self.driver.save_screenshot(filename)
        print('\nScreenshot saved as {}'.format(filename))

    @staticmethod
    def screenshots_collector():
        '''
        Collect all screenshots and put them into screenshots directory
        :return:
        '''
        import os
        import shutil

        screenshots_folder = 'screenshots'
        if not os.path.exists(os.curdir + '\\screenshots'):
            os.mkdir(screenshots_folder)

        now = datetime.datetime.now()
        folder_name = '{}\\screenshots_{}'.format(
            screenshots_folder,
            datetime.datetime.strftime(now, '%Y-%m-%d_%H-%M-%S'))

        files = os.listdir(os.curdir)
        for file in files:
            if '.png' in str(file):
                if not os.path.exists(os.curdir + '\\' + folder_name):
                    os.mkdir(folder_name)
                shutil.move(
                    file.split('\\')[-1], os.curdir + '\\' + folder_name)

    def tearDown(self):
        for handle in self.driver.window_handles:
            self.driver.switch_to.window(handle)
            self.driver.stop_client()
            self.driver.close()
        time.sleep(1)

    @classmethod
    def tearDownClass(cls):
        if cls.driver is not None:
            cls.driver.quit()