web项目实战+框架(4)-复杂用例的设计

  • locator分层

隔离元素定位表达式和浏览器操作,当元素定位表达式发生变化时,只需要修改元素定位表达式。

方式1:直接放在po页面对象,作为类属性。

分层前代码:

from selenium.webdriver.common.by import By
from pages.basepage import Page
from setting import config
 
 
class LoginPage(Page):
    url = config.host + '/User/login.html'
  
 
    def load(self):
        """加载页面"""
        return self.browser.get(self.url)
   
    def login(self, username, password):
        """登录"""
        locator_username = (By.NAME, 'account')
        locator_password = (By.NAME, 'pass')
        locator_signin_btn = (By.CSS_SELECTOR, '.btn-btn')
        self.fill(locator_username, locator_password)
        self.fill(locator_password, password)
        self.click(locator_signin_btn)
 
    def get_error_tips(self):
        """获取错误信息"""
        return self.browser.find_element(By.CSS_SELECTOR, '.error-tips').text

分层后代码:

from selenium.webdriver.common.by import By
from pages.basepage import Page
from setting import config


class LoginPage(Page):
    url = config.host + '/User/login.html'
    # 存储所有的登录页面的元素定位表达式
    # 用户名
    locator_username = (By.NAME, 'account')
    # 密码
    locator_password = (By.NAME, 'pass')
    # 登录按钮
    locator_signin_btn = (By.CSS_SELECTOR, '.btn-btn')
    # 错误信息提示框定位
    locator_error_tips = (By.CSS_SELECTOR, '.error-tips')

    def load(self):
        """加载页面"""
        return self.browser.get(self.url)

    def login(self, username, password):
        """登录"""
        self.fill(self.locator_username, username)
        self.fill(self.locator_password, password)
        self.click(self.locator_signin_btn)

    def get_error_tips(self):
        """获取错误信息"""
        return self.browser.find_element(*self.locator_error_tips).text

方式2:创建一个独立的文件来管理元素定位表达式(使用前先导入模块)。

from selenium.webdriver.common.by import By


class HomePageLocator:
    """存放homepage中所有元素定位表达式"""
    # 头像定位
    locator_avatar = (By.CSS_SELECTOR, '.avatar')


class LoginPageLocator:
    """存放loginpage中所有元素定位表达式"""
    # 存储所有的登录页面的元素定位表达式
    # 用户名
    locator_username = (By.NAME, 'account')
    # 密码
    locator_password = (By.NAME, 'pass')
    # 登录按钮
    locator_signin_btn = (By.CSS_SELECTOR, '.btn-btn')
    # 错误信息提示框定位
    locator_error_tips = (By.CSS_SELECTOR, '.error-tips')
  • 签到功能复杂用例编写

以课堂派签到为例:

步骤:签到涉及到两种角色,由老师或者管理员发起考勤,生成签到码;学生获得签到码登录进行签到。需要打开两个浏览器进行相关操作。

老师或者管理员端:

1、需要打开老师的浏览器

2、登录老师账号

3、在首页点击课堂名称“python九歌”进入教室,link text =python九歌

4、在教室界面点击"考勤"按钮,xpath=//span[text()='考勤']/..

5、在教室界面切换到iframe,定位iframe,id=layui-layer-content1

6、在iframe界面定位“新建考勤”,xpath=//a[contains(text(),'新建考勤')],点击

7、在教室页面,同一个iframe,定位“数字考勤”,xpath=//span[text='数字考勤']

8、在教室页面,同一个iframe,定位“开始考勤”,link text ='开始考勤'

9、在教室页面,获取签到码:定位4个span元素,driver.find_elements(xpath,"//div[@class='number-box']/span"),取出四个元素的text文本,列表转化成字符串,"".join([])

10、学生签到成功后,添加强制等待,在教室页面获取签到人数的文本,css=.ing ,assert 断言人数=="1"

11、结束签到 link text='结束'

12、确认结束签到 ,xpath=/html/body/div[3]/div/div[3]/span/button[2]/span

学生端:

1、打开一个学生角色的浏览器

2、登录学生账号

3、在首页点击课堂名称“python九歌”进入教室,link text =python九歌

4、在教室界面点击“立即签到”,link text=’立即签到‘

5、在签到输入框输入签到码,定位输入框,id=phoneVer_modalAuthInput

web/ui自动化测试的特征:

特征1:效率慢

特征2:不稳定(元素定位不稳定;前端界面经常发生变化)

上一篇:bootstrap 栅格系统


下一篇:MX6Q移植QT5.9.1