我有一个 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 应用程序未启动,控件将返回到登录页面。
非常感谢任何帮助。
一些反馈...
您当前标记为测试的内容实际上是测试的步骤。测试应该完成所有步骤并验证某些内容。每个测试都应该打开浏览器,执行一些步骤,断言一项或多项操作,然后退出浏览器。这样每个测试都是独立的,它不依赖于其他“测试”来设置状态等,并且它使用自己的浏览器实例,因此不同的测试不会相互污染。这还允许您并行运行每个测试,从而在套件运行时获得巨大的速度提升。
根据您的描述,我假设您实际上并未测试 Site Minder 应用程序...您只需通过它即可到达您想要测试的应用程序。如果这是真的,登录并验证它是否将您传递到 UAT URL 应该是
setup()
的一部分。
捕获异常时,仅捕获您计划处理的异常,并且仅捕获特定的异常。抓住
WebDriverException
然后声称 UAT 已关闭似乎是误导。
您拥有的许多断言都是不需要的。例如,您断言您在单击“同意”按钮*之后*发现了该按钮。如果不存在,则已经抛出异常。
driver.maximize_window()
应立即位于 setup()
中。
一切都不必附加到
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 的情况。