🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## **5.3 模块化与参数化** 模块化与参数化一般需要配合使用,即在创建函数或类方法时为它们设置入参,从而使它们可以根据不同的参数执行相应的操作。 下面用一个简单的例子介绍它们的用法。创建一个邮箱测试脚本test_mail.py。 ``` from time import sleep from selenium import webdriver driver = webdriver.Chrome() driver.get("https://mail.163.com/") # 登录 sleep(2) driver.switch_to.frame(0) # iframe_tag = driver.find_element_by_tag_name("iframe") # print(iframe_tag) driver.find_element_by_name("email").click() driver.find_element_by_name("email").send_keys("username") driver.find_element_by_name("password").clear() driver.find_element_by_name("password").send_keys("password") driver.find_element_by_id("dologin").click() # 登录之后的动作 sleep(5) # 退出 # driver.find_element_by_id("spnUid").click() # driver.find_element_by_link_text("退出").click() driver.switch_to.default_content() driver.quit() ``` <br /> 假设要实现一个关于邮箱的自动化测试项目,那么可能每条测试用例都需要有登录动作和退出动作。大部分测试用例都是在登录之后进行的,例如,发邮件,查看、删除、搜索邮件等。此时,需要创建一个新的 module.py 文件来存放登录动作和退出动作。 ``` class Mail: def __init__(self, driver): self.driver = driver def login(self): '''登录''' self.driver.switch_to.frame(0) self.driver.find_element_by_name("email").clear() self.driver.find_element_by_name("email").send_keys("name") self.driver.find_element_by_name("password").clear() self.driver.find_element_by_name("password").send_keys("pwd") self.driver.find_element_by_id("dologin").click() def logout(self): '''退出''' self.driver.switch_to.default_content() ``` 首先创建一个 Mail 类,在__init__()初始化方法中接收 driver 驱动并赋值给 self.driver。 在 login()和 logout()方法中分别使用 self.driver 实现邮箱的登录动作和退出动作。 接下来修改 test_mail.py,测试调用 Mail 类中的 login()和 logout()方法。 ``` from time import sleep from selenium import webdriver from module import Mail driver = webdriver.Chrome() driver.get("https://mail.163.com/") # 调用Mail类并接收driver驱动 mail = Mail(driver) #登录 mail.login() sleep(5) # 退出 mail.logout() driver.quit() ``` 在编写测试用例过程中,如果需要用到登录动作和退出动作,那么只需调用 Mail 类中的 login()方法和 logout()方法即可,这将大大提高测试代码的可复用性。 如果我们的需求是测试登录功能呢?虽然登录步骤是固定的,但是测试的数据(账号)不同,这时就需要把 login()方法参数化。修改 module.py 文件代码如下。 ``` # ...... def login(self, username, password): '''登录''' self.driver.switch_to.frame(0) self.driver.find_element_by_name("email").clear() self.driver.find_element_by_name("email").send_keys("username") self.driver.find_element_by_name("password").clear() self.driver.find_element_by_name("password").send_keys("password") self.driver.find_element_by_id("dologin").click() ``` 这样就进一步提高了 login()方法的可复用性,它不再使用一个固定的账号登录,而是根据被调用者传来的用户名和密码执行登录动作。 在测试用例中,可以用不同的数据调用 login()方法。 ``` # 调用Mail类并接收driver驱动 mail = Mail(driver) #用户名为空 mail.login("", "password") # 密码为空 mail.login("zjut_cheng", "") # 用户名/密码错误 mail.login("cc", "1") ```