如何使用 python selenium 重新连接到 URL

问题描述 投票:0回答:1

我有一个 Selenium-Python 测试套件,用于运行 UI 应用程序的回归测试。

@pytest.fixture(scope='class')
def setup(request):
  driver = None
  try:
    options = webdriver.ChromeOptions()
    options.add_argument('--no-sandbox')
    options.add_argument("--window-size=1920,1080")
    options.add_argument("--start-maximized")
    options.add_argument('--headless')
    options.add_argument('--ignore-certificate-errors')
    driver = webdriver.Chrome(options=options)
    request.cls.driver = driver
    driver.delete_all_cookies()
    driver.get(TestData_common.BASE_URL)
except WebDriverException as e:
    print('UAT seems to be down...> ', e)
yield driver
if driver is not None:
    print("Quitting the driver..")
    driver.quit()

@pytest.mark.usefixtures("setup")
@pytest.mark.incremental
class Test_InvPayment:

  def test_001_login(self):
    """Login to UAT and click AGREE button in Site Minder"""
    assert TestData_common.URL_FOUND, "UAT seems to be down.."
    self.loginPage = LoginPage(self.driver)
    self.loginPage.do_click_agree_button()
    assert TestData_common.AGREE_BTN_FOUND, "Unable to click Site Minder AGREE btn"
    self.driver.maximize_window()
    print('Successfully clicked AGREE button in SiteMinder')
    time.sleep(2)

def test_002_enter_user_and_password(self):
    """Enter User name for UAT"""
    self.loginPage = LoginPage(self.driver)
    TestData_common.UserEnabled = True
    self.loginPage.do_enter_user_name(TestData_common.USER_NAME_6, 'USER')
    assert TestData_common.UserEnabled, "Unable to enter User Name.."
    print('Entered User name:', TestData_common.USER_NAME_6)
    time.sleep(2)

def test_003_enter_password(self):
    """Enter Password for Treasury"""
    self.loginPage = LoginPage(self.driver)
    self.loginPage.do_enter_password(TestData_common.PASSWORD, 'PASS')
    assert TestData_common.PasswordEnabled, "Unable to enter Password.."
    print('Entered password:', TestData_common.PASSWORD)
    time.sleep(2)

def test_004_click_login_button(self):
    """Click LOGIN button"""
    self.loginPage = LoginPage(self.driver)
    self.loginPage.do_click_login_button()
    assert TestData_common.LOGIN_BTN_FOUND, "Unable to click LOGIN button.."
    print('Clicked LOGIN button')

此代码在大多数情况下都运行良好。

有时,siteminder 应用程序位于 UAT 应用程序前面,负责将流量重定向到 UAT 应用程序。这是我输入用户/密码并登录应用程序的地方。有时,无论出于何种原因,siteminder 应用程序不会重定向到 UAT 应用程序,在这种情况下,test_004 之后的所有测试都会失败。 在这些情况下,我想构建一种重试机制来再次启动 URL 并尝试再次登录。这里有办法做到这一点吗?我想要的只是点击 test_004 中的登录按钮后,如果 UAT 应用程序未启动,控件将返回到登录页面。

非常感谢任何帮助。

python selenium-webdriver
1个回答
0
投票

一些反馈...

  1. 您当前标记为测试的内容实际上是测试的步骤。测试应该完成所有步骤并验证某些内容。每个测试都应该打开浏览器,执行一些步骤,断言一项或多项操作,然后退出浏览器。这样每个测试都是独立的,它不依赖于其他“测试”来设置状态等,并且它使用自己的浏览器实例,因此不同的测试不会相互污染。这还允许您并行运行每个测试,从而在套件运行时获得巨大的速度提升。

  2. 根据您的描述,我假设您实际上并未测试 Site Minder 应用程序...您只需通过它即可到达您想要测试的应用程序。如果这是真的,登录并验证它是否将您传递到 UAT URL 应该是

    setup()
    的一部分。

  3. 捕获异常时,仅捕获您计划处理的异常,并且仅捕获特定的异常。抓住

    WebDriverException
    然后声称 UAT 已关闭似乎是误导。

  4. 您拥有的许多断言都是不需要的。例如,您断言您在单击“同意”按钮*之后*发现了该按钮。如果不存在,则已经抛出异常。

  5. 创建驱动程序后,
  6. driver.maximize_window()
    应立即位于
    setup()
    中。

  7. 一切都不必附加到

    self
    ,例如
    loginPage
    。您可以创建页面的实例,使用它,并在测试完成后处理它。

鉴于此反馈,我会将您的代码重写为类似的内容。

@pytest.fixture(scope='class')
def setup(request):
    driver = None
    options = webdriver.ChromeOptions()
    options.add_argument('--no-sandbox')
    options.add_argument("--window-size=1920,1080")
    options.add_argument("--start-maximized")
    options.add_argument('--headless')
    options.add_argument('--ignore-certificate-errors')
    driver = webdriver.Chrome(options=options)
    driver.maximize_window()
    request.cls.driver = driver
    driver.delete_all_cookies()
    log_into_siteminder()
    yield driver
    if driver is not None:
        print("Quitting the driver..")
        driver.quit()

def log_into_siteminder(self):
    """Attempts to log into SiteMinder and get into UAT up to three times"""
    max_attempts = 3
    attempts = 0
    while attempts < max_attempts:
        self.driver.get(TestData_common.BASE_URL)
        loginPage = LoginPage(self.driver)
        loginPage.do_click_agree_button()
        TestData_common.UserEnabled = True # I don't know what this does
        loginPage.do_enter_user_name(TestData_common.USER_NAME_6, 'USER')
        loginPage.do_enter_password(TestData_common.PASSWORD, 'PASS')
        loginPage.do_click_login_button()
        if driver.current_url == UAT_URL:
            break
        else:
            attempts += 1
    raise Exception(f"UAT could not be reached after {max_attempts} attempts.")

@pytest.mark.usefixtures("setup")
class Test_InvPayment:
    def test_001_task1(self):
        """Do some task in UAT"""
    def test_002_task2(self):
        """Do some task in UAT"""
    def test_003_task3(self):
        """Do some task in UAT"""

注意:我没有你的所有代码,所以我无法测试上面的代码,所以我可能犯了没有被捕获的拼写错误等,但它应该为你指明正确的方向,以清理你的测试和如何干净地处理通过 SiteMinder 的情况。

© www.soinside.com 2019 - 2024. All rights reserved.