【实战练习】web自动化测试实战
【实战练习】web 自动化测试实战
实战需求
点击查看实战详情
实现思路

优化点
成员添加失败自动化测试用例场景
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");
}