Skip to content

【实战练习】web自动化测试实战

【实战练习】web 自动化测试实战

实战需求

点击查看实战详情

实现思路

uml diagram

优化点

成员添加失败自动化测试用例场景

python 实现
@allure.title('添加账号重复的成员失败')
    def test_add_member_failure(self):
        def write_info(name, mid, phone):
            '''
            填写成员信息
            :param name: 姓名
            :param mid: 账号
            :param phone: 手机号
            :return:
            '''
            # 等待添加成员按钮可点击
            WebDriverWait(self.driver, 10).until(
                expected_conditions.element_to_be_clickable(
                    (By.CSS_SELECTOR, '.member_colRight_memberTable_td:nth-child(2)'))
            )
            # 点击添加成员按钮
            self.driver.find_elements(By.CSS_SELECTOR, '.qui_btn.ww_btn.js_add_member')[1].click()
            # 等待详情页渲染完成
            WebDriverWait(self.driver, 10).until(
                expected_conditions.visibility_of_element_located((By.ID, 'username'))
            )
            # 姓名
            self.driver.find_element(By.ID, 'username').send_keys(name)
            # 账号
            self.driver.find_element(By.ID, 'memberAdd_acctid').send_keys(mid)
            # 手机号
            self.driver.find_element(By.ID, 'memberAdd_phone').send_keys(phone)

        # 点击通讯录按钮
        self.driver.find_element(By.ID, 'menu_contacts').click()

        with allure.step('添加成员成功'):
            write_info(self.mname, self.mid, self.phone_num)
        with allure.step('点击保存'):
            # 点击保存
            self.driver.find_elements(By.CSS_SELECTOR, '.qui_btn.ww_btn.js_btn_save')[0].click()
        # 等待列表元素完全显示
        WebDriverWait(self.driver, 10).until(expected_conditions.visibility_of_element_located(
            (By.CSS_SELECTOR, '.member_fixedTip_exportLink.js_export_unactived')))

        with allure.step('断言添加成功'):
            # 断言
            # 获取成员姓名列表
            names = self.driver.find_elements(By.CSS_SELECTOR, '.member_colRight_memberTable_td:nth-child(2)')
            # 提取成员姓名,放入列表
            name_list = []
            for n in names:
                name_list.append(n.text)
            assert self.mname in name_list
        '''
        添加失败
        1. 添加姓名和账号不同,但账号相同的成员
        2. 断言提示重复的信息、断言通讯录没有账号重复的成员
        '''
        new_name = self.faker.name()
        new_phone = self.faker.phone_number()
        with allure.step('添加成员失败'):
            write_info(new_name, self.mid, new_phone)
        with allure.step('保存失败'):
            # 点击保存
            self.driver.find_elements(By.CSS_SELECTOR, '.qui_btn.ww_btn.js_btn_save')[0].click()
        with allure.step('断言提示重复账号信息'):
            # 获取账号后方的红色提示信息
            tips = self.driver.find_element(By.CSS_SELECTOR,
                                            '.member_edit_item_right.ww_inputWithTips_WithErr div').text
            assert f'该账号已被“{self.mname}”占有' == tips
        with allure.step('断言列表成员不包含添加失败的成员'):
            # 点击取消
            self.driver.find_elements(By.CSS_SELECTOR, '.qui_btn.ww_btn.js_btn_cancel')[0].click()
            # 获取成员姓名列表
            names = self.driver.find_elements(By.CSS_SELECTOR, '.member_colRight_memberTable_td:nth-child(2)')
            # 提取成员姓名,放入列表
            name_list = []
            for n in names:
                name_list.append(n.text)
            assert new_name not in name_list
java 实现
    /**
     * 添加重复成员失败功能
     * 1. 进入添加成员页面
     * 2. 输入成员信息点击保存
     * 3. 检查成员列表页面
     * 4. 进入添加成员页面
     * 5. 输入重复的账号
     * 6. 点击保存
     * 7. 检查成员列表是否出现重复的账号信息
     */
    @DisplayName("添加重复成员失败功能")
    @Test
    void addMemberRepeatTest() {

        // 进入添加成员页面
        Allure.step("进入添加成员页面");
        By addressBookBtn = By.linkText("通讯录");
        driver.findElement(addressBookBtn).click();
        By addMemberBtn = By.cssSelector(".ww_operationBar .js_add_member");
        // 等待元素可点击
        wait.until(ExpectedConditions.elementToBeClickable(addMemberBtn));
        driver.findElement(addMemberBtn).click();

        // 输入成员信息点击保存
        Allure.step("输入成员信息点击保存");
        By usernameInput = By.name("username");
        By accountInput = By.id("memberAdd_acctid");
        By phoneInput = By.xpath("//input[@name=\"mobile\"]");
        By saveBtn = By.xpath("//a[text()=\"保存\"]");
        String username = "李四";
        String account = Long.toString(System.currentTimeMillis());
        String phone = account.substring(0, 11);
        // 等待元素可见
        wait.until(ExpectedConditions.visibilityOfElementLocated(saveBtn));
        driver.findElement(usernameInput).sendKeys(username);
        driver.findElement(accountInput).sendKeys(account);
        driver.findElement(phoneInput).sendKeys(phone);
        driver.findElement(saveBtn).click();

        // 断言添加成员信息是否包含在成员列表中
        Allure.step("断言添加成员信息是否包含在成员列表中");
        By memberTextItems = By.cssSelector(".member_colRight_memberTable_td");
        // 等待元素可见
        wait.until(ExpectedConditions.visibilityOfElementLocated(memberTextItems));
        List<String> memberTexts = driver.findElements(memberTextItems)
                .stream().map(WebElement::getText).collect(Collectors.toList());
        assertThat(memberTexts, hasItems(username));
        assertThat(memberTexts, hasItems(phone));


        wait.until(ExpectedConditions.elementToBeClickable(addMemberBtn));
        driver.findElement(addMemberBtn).click();

        // 输入重复账号成员信息点击保存
        Allure.step("输入重复账号成员信息点击保存");
        By cancelBtn = By.linkText("取消");
        By repeatTips = By.cssSelector(".member_edit_item_Account .ww_inputWithTips_tips");
        String new_username = "王五";
        String repeat_account = account;
        String new_phone = account.substring(1, 12);
        // 等待元素可见
        wait.until(ExpectedConditions.visibilityOfElementLocated(saveBtn));
        driver.findElement(usernameInput).sendKeys(new_username);
        driver.findElement(accountInput).sendKeys(repeat_account);
        driver.findElement(phoneInput).sendKeys(new_phone);
        // 断言是否出现提示
        wait.until(driver -> !driver.findElement(repeatTips).getText().equals(""));
        String repeatTipsText = driver.findElement(repeatTips).getText();
        assertThat(repeatTipsText,equalTo("该账号已被“"+username+"”占有"));
        driver.findElement(saveBtn).click();
        driver.findElement(cancelBtn).click();

        // 断言添加成员信息是否包含在成员列表中
        Allure.step("断言添加成员信息是否包含在成员列表中");
        // 等待元素可见
        wait.until(ExpectedConditions.visibilityOfElementLocated(memberTextItems));
        List<String> new_memberTexts = driver.findElements(memberTextItems)
                .stream().map(WebElement::getText).collect(Collectors.toList());
        // 判断断言列表数据是否正常
        assertThat(new_memberTexts, not(hasItems(new_phone)));
    }

测试报告、断言

python 实现
# 断言账号提示重复信息
tips = self.driver.find_element(By.CSS_SELECTOR,
                                '.member_edit_item_right.ww_inputWithTips_WithErr div').text
assert f'该账号已被“{self.mname}”占有' == tips

# 断言通讯录列表不存在添加失败成员
names = self.driver.find_elements(By.CSS_SELECTOR, '.member_colRight_memberTable_td:nth-child(2)')
# 提取成员姓名,放入列表
name_list = []
for n in names:
name_list.append(n.text)
assert new_name not in name_list
java 实现
List<String> new_memberTexts = driver.findElements(memberTextItems)
        .stream().map(WebElement::getText).collect(Collectors.toList());
// 判断断言列表数据是否正常
assertThat(new_memberTexts, not(hasItems(new_phone)));

显示等待优化

python 实现
# 等待元素可点击
 WebDriverWait(self.driver, 10).until(
                expected_conditions.element_to_be_clickable(
                    (By.CSS_SELECTOR, '.member_colRight_memberTable_td:nth-child(2)'))
            )
# 等待元素可交互
WebDriverWait(self.driver, 10).until(
        expected_conditions.visibility_of_element_located((By.ID, 'username'))
        )
java 实现
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(30), Duration.ofSeconds(1));

// 等待元素可点击
wait.until(ExpectedConditions.elementToBeClickable(addMemberBtn));

// 等待元素可见
wait.until(ExpectedConditions.visibilityOfElementLocated(saveBtn));

// 自定义显示等待条件
wait.until(driver -> !driver.findElement(repeatTips).getText().equals(""));

setup 回到首页

python 实现
def setup_method(self):
    '''
    每个用例执行前回到首页
    :return:
    '''
    self.driver.get(self.index_url)
java 实现
@BeforeEach
void goIndexPage(){
    driver.get("https://work.weixin.qq.com/wework_admin/loginpage_wx");
}