六、web自动化测试02
目录
- 一、商品上架业务
- 二、下单业务
- 1、登录成功
- 2、下单成功
- 2.1 获取浏览器title和url
- 2.2 浏览器多窗口处理
- 2.3 窗口截图
- 2.4 alert弹窗处理
- 三、其他API
- 1、浏览器操作
- 2、获取元素信息
- 3、滚动条处理
- 4、鼠标操作
- 5、元素等待
- 5.1 隐式等待
- 5.2 显式等待
- 5.3 二者区别(面试题)
- 四、xpath定位
- 五、总结
- 1、常见元素定位方法
- 2、元素定位失败原因
一、商品上架业务
- 能通过select下拉操作,实现下拉值自动选择
- 技术点:定位一组元素
- 方法:driver.find_elements(定位策略, 表达式)
- 结果:返回所有找到元素的一个列表,通过列表的下标进行取值操作
# 导包
import time
import random
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from tools.chromeDriver import get_driver, quit_driver# 获取浏览器并打开页面
driver = get_driver("https://hmshoptest.itheima.net/index.php/Admin/Admin/login")#页面操作
# 1、商家登录
driver.find_elements(By.CLASS_NAME, "input-text")[0].send_keys("admin") # ctrl + d
driver.find_elements(By.CLASS_NAME, "input-text")[1].send_keys("HM_2023_test")
driver.find_elements(By.CLASS_NAME, "input-text")[2].send_keys("8888")
time.sleep(1)
driver.find_element(By.CLASS_NAME, "sub").click()# 2、打开商品上架页面
# 2.1 点击导航栏的【商城】
time.sleep(1)
# driver.find_element(By.LINK_TEXT, "商城").click()
driver.find_element(By.PARTIAL_LINK_TEXT, "商城").click()# 2.2 点击左侧导航栏【商品列表】
time.sleep(1)
driver.find_element(By.LINK_TEXT, "商品列表").click()# 2.3 点击【添加商品】按钮
# 元素定位失败场景1:页面存在frame嵌套,需要①先切换到指定的frame页 ② 完成页面元素定位与操作 ③ 返回默认页面
time.sleep(1)
# 2.3.1 切换frame窗口
driver.switch_to.frame(driver.find_element(By.ID, "workspace"))# 2.3.2 frame上元素定位与操作
driver.find_elements(By.CLASS_NAME, "add")[0].click()# 2.3.3 返回默认页面供后续业务操作
driver.switch_to.default_content()# 3、添加商品
# ① 切换页面
driver.switch_to.frame(driver.find_element(By.ID, "workspace"))
# ② 页面操作
# 3.1 商品名称
time.sleep(1)
driver.find_element(By.NAME, "goods_name").send_keys(f"Jack-Test-1214-
{random.randint(101, 666)}")# 3.2 商品分类
# driver.find_element(By.ID, "cat_id").click()
# time.sleep(2)
# driver.find_element(By.CSS_SELECTOR, "#cat_id>[value='7']").click()
# time.sleep(1)
# 基于select-option下拉框 使用selenium自带的select工具类进行操作
select = Select(driver.find_element(By.ID, "cat_id")) # 快捷导包 ctrl + alt + 空格
# select.select_by_value("7") # 根据value属性进行定位
# select.select_by_visible_text("鞋、箱包、珠宝、手表") # 根据下拉框的可见文字进行定位
select.select_by_index(1) # 根据option下标取值进行定位# 3.3 本店售价
driver.find_element(By.NAME, "shop_price").send_keys(10)# 3.4 市场价
driver.find_element(By.NAME, "market_price").send_keys(20)# 3.5 是否包邮
driver.find_element(By.ID, "is_free_shipping_label_1").click()# 3.6 提交
time.sleep(1)
driver.find_element(By.LINK_TEXT, "确认提交").click()# ③ 返回默认页面
driver.switch_to.default_content()
# 退出浏览器
quit_driver(driver)
二、下单业务
- 能通过js自动处理alert弹出窗
- 能通过窗口截图方法保留自动化测试结果
- 能实现多窗口自动切换
下单业务:
1、首页
2、登录
3、搜索
4、浏览商品
5、购物车
6、提交订单
7、支付
8、我的订单
1、登录成功
# 导包
import time
from selenium.webdriver.common.by import By
from tools.chromeDriver import get_driver, quit_driver# 下单业务
# 1、打开首页
driver = get_driver("https://hmshoptest.itheima.net/index.php/Home/Index/index.html")#2、点击首页【登录】 打开登录页面
driver.find_element(By.LINK_TEXT, "登录").click()# 3、输入账号密码完成登录成功
driver.find_element(By.ID, "username").send_keys("13488888888")
driver.find_element(By.ID, "password").send_keys("123456")
driver.find_element(By.ID, "verify_code").send_keys("8888")
driver.find_element(By.LINK_TEXT, "登 录").click()
time.sleep(3)# 退出浏览器
quit_driver(driver)
2、下单成功
# 导包
import time
from selenium.webdriver.common.by import By
from tools.chromeDriver import get_driver, quit_driver# 下单业务
# 1、打开首页
driver = get_driver("https://hmshoptest.itheima.net/index.php/Home/Index/index.html")#2、点击首页【登录】 打开登录页面
driver.find_element(By.LINK_TEXT, "登录").click()# 3、输入账号密码完成登录成功
driver.find_element(By.ID, "username").send_keys("13488888888")
driver.find_element(By.ID, "password").send_keys("123456")
driver.find_element(By.ID, "verify_code").send_keys("8888")
driver.find_element(By.LINK_TEXT, "登 录").click()
time.sleep(2)# 4、点击搜索框、搜索商品
driver.find_element(By.ID, "q").send_keys("Jack-Test-1214")
driver.find_element(By.LINK_TEXT, "搜索").click()
time.sleep(2)# 5、点击商品列表中的【加入购物车】
driver.find_elements(By.LINK_TEXT, "加入购物车")[0].click()
time.sleep(2)# 6、进入购物车 查看商品信息
# 6.1 关闭弹窗界面
driver.find_element(By.CLASS_NAME, "layui-layer-setwin").click()
time.sleep(2)# 6.2 点击页面购物车图标
driver.find_element(By.CSS_SELECTOR, ".c-n.fl").click()
time.sleep(2)# 7、查看购物车信息并结算
driver.find_element(By.LINK_TEXT, "去结算").click()
time.sleep(2)# 8、提交订单
driver.find_element(By.ID, "submit_order").click()
# 元素定位失败常见场景:页面元素未加载完全、导致定位失败
# 解决:设置等待时间
# 强制等待
# 显式等待
# 隐式等待
time.sleep(5)# 9、支付
driver.find_element(By.LINK_TEXT, "确认支付方式").click()
time.sleep(2)# 打印当前页面标题信息
print(driver.title)
print(driver.current_url)# 10、点击我的订单 查看订单状态
driver.find_element(By.LINK_TEXT, "我的订单").click()
time.sleep(2)# 切换窗口信息
# 定位失败的常见场景:浏览器多窗口切换
handles = driver.window_handles # 获取所有浏览器已打开的窗口信息 (句柄)
driver.switch_to.window(handles[1]) # 使用下标处理指定的窗口# 打印当前页面的标题信息
print(driver.title)
print(driver.current_url)# 退出浏览器
quit_driver(driver)
2.1 获取浏览器title和url
2.2 浏览器多窗口处理
2.3 窗口截图
# 11、截图保存当前订单页
driver.get_screenshot_as_file("order.png")
2.4 alert弹窗处理
- 能通过js自动处理alert弹出窗
- 需求:打开注册页面,完成以下操作:
1).点击 alert 按钮
2).关闭警告框
3).输入用户名:admin - 项目:http://121.43.169.97:8848/pageA.html
# 导包
import time
from selenium.webdriver.common.by import By
from tools.chromeDriver import get_driver, quit_driver# 打开页面
driver = get_driver("http://121.43.169.97:8848/pageA.html")# 1).点击 alert 按钮
driver.find_element(By.ID, "alerta").click()
time.sleep(1)# 2).关闭警告框
driver.switch_to.alert.accept()
time.sleep(1)# 3).输入用户名:admin
driver.find_element(By.ID, "userA").send_keys("admin")
time.sleep(1)# 退出浏览器
quit_driver(driver)
三、其他API
1、浏览器操作
- 能通过浏览器操作方法,实现浏览器窗口最大化、并获取浏览器标题和url信息
# 导包
import time
from selenium.webdriver.common.by import By
from tools.chromeDriver import get_driver# 浏览器窗口最大化访问商城
driver = get_driver("https://hmshoptest.itheima.net/index.php/Home/Index/index.html")
driver.maximize_window()#获取当前页面标题及URL信息
print(driver.title)
print(driver.current_url)
print("-" * 80)# 首页跳转至登录页并登录
driver.find_element(By.LINK_TEXT, "登录").click()
time.sleep(1)# 获取登录成功后页面标题及URL信息
# 1、登录成功
driver.find_element(By.ID, "username").send_keys("13488888888")
driver.find_element(By.ID, "password").send_keys("123456")
driver.find_element(By.ID, "verify_code").send_keys("8888")
driver.find_element(By.NAME, "sbtbutton").click()
time.sleep(1)# 2、获取当前页面标题及URL信息
print(driver.title)
print(driver.current_url)
print("-" * 80)# 个人中心跳转至我的浏览页
driver.find_element(By.LINK_TEXT, "我的浏览").click()
time.sleep(1)# 获取当前页面标题及URL信息
# 多窗口切换
handles = driver.window_handles
driver.switch_to.window(handles[1])
print(driver.title)
print(driver.current_url)
print("-" * 80)
time.sleep(2)# 关闭我的浏览页面
driver.close()
time.sleep(3)# 退出浏览器
driver.quit()
2、获取元素信息
# 导包
import time
from selenium.webdriver.common.by import By
from tools.chromeDriver import get_driver# 浏览器窗口最大化访问商城
driver = get_driver("https://hmshop-test.itheima.net/Home/user/reg.html")# 需求:
# 1).获取手机号码输入框的大小
print(driver.find_element(By.NAME, "username").size)# 2).获取页面上第一个span标签的文本内容
print(driver.find_elements(By.TAG_NAME, "span")[0].text)# 3).获取页面上登录超链接的地址
print(driver.find_element(By.PARTIAL_LINK_TEXT, "登录").get_attribute("href"))# 4).判断页面中【用户服务协议】是否为选中状态
print(driver.find_element(By.ID, "checktxt").is_selected())# 5).判断页面中的【同意协议并注册】是否可用
print(driver.find_element(By.CSS_SELECTOR, ".regbtn.J_btn_agree").is_enabled())# 退出浏览器
driver.quit()
3、滚动条处理
- 能控制滚动条自动滑动到指定位置
# 导包
import time
from selenium.webdriver.common.by import By
from tools.chromeDriver import get_driver# 浏览器窗口最大化访问商城
driver = get_driver("https://hmshop-test.itheima.net/Home/Index/index.html")# 需求:打开商城首页,完成以下操作
#
# 1).暂停2s,控制滚动条滑动到页面最底部
time.sleep(2)
js = "window.scrollTo(0, 10000)"
driver.execute_script(js)# 2).暂停2s,控制滚动条回到顶部
time.sleep(2)
js = "window.scrollTo(0, 0)"
driver.execute_script(js)
time.sleep(2)# 退出浏览器
driver.quit()
4、鼠标操作
- 能通过鼠标操作实现首页导航商品自动选择
# 导包
import time
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from tools.chromeDriver import get_driver# 浏览器窗口最大化访问商城
driver = get_driver("https://hmshop-test.itheima.net/Home/Index/index.html")# 需求:打开商城首页,完成以下操作
#
# 1).暂停2s,鼠标悬停【箱包】分类
time.sleep(2)
action = ActionChains(driver)
action.move_to_element(driver.find_element(By.LINK_TEXT, "箱包"))
action.perform()
time.sleep(2)# 2).暂停2s,查看【珠宝】分类下商品信息
driver.find_element(By.LINK_TEXT, "珠宝").click()
time.sleep(3)# 退出浏览器
driver.quit()
5、元素等待
- 能使用元素等待方法来提升自动化脚本运行效率
5.1 隐式等待
-
需求:打开注册页面,完成以下操作
1).最大化窗口
2).使用隐式等待定位延时加载输入框,输入admin -
项目地址:http://121.43.169.97:8848/pageA.html
# 导包
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from tools.chromeDriver import get_driver# 浏览器窗口最大化访问商城
driver = get_driver("http://121.43.169.97:8848/pageA.html")# 隐式等待
driver.implicitly_wait(10)
driver.find_element(By.ID, "username").send_keys("admin")
time.sleep(3)# 退出浏览器
driver.quit()
5.2 显式等待
-
需求:打开注册页面,完成以下操作
1).最大化窗口
2).使用隐式等待定位延时加载输入框,输入admin -
项目地址:http://121.43.169.97:8848/pageA.html
# 导包
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from tools.chromeDriver import get_driver# 浏览器窗口最大化访问商城
driver = get_driver("http://121.43.169.97:8848/pageA.html")# 显式等待
element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element(By.ID,
"username"))
element.send_keys("admin")
time.sleep(3)# 退出浏览器
driver.quit()
5.3 二者区别(面试题)
四、xpath定位
- 能够通过xpath定位到页面元素
- 技术点:xpath定位
- 策略:
- ① 路径定位:
- 绝对路径(/html/xxx 注意:不推荐) 检查==》复制==》复制完整xpath
- 相对路径(//* xxx) 检查==》复制==》复制xpath
- ② 文本定位:
- 相等 //*[text()=‘文字’]
- 包含 //*[contains(text(), ‘文字’)]
- ① 路径定位:
- 场景:当页面元素没有基本信息时。可以继续页面显示文字通过xpath进行定位
需求:xpath定位实现冷链监控系统自动登录
说明:
项目地址:http://120.26.52.119/
账号:admin
密码:HM_2023_test
#
import time
from selenium.webdriver.common.by import By
# 导包
from tools.chromeDriver import get_driver, quit_driver# 打开页面
driver = get_driver("http://120.26.52.119/")# 页面操作
# 输入账号
driver.find_element(By.XPATH, '//*
[@id="app"]/div/form/div[2]/div[1]/div/div[1]/input').send_keys("admin")# 输入密码
driver.find_element(By.XPATH, '//*
[@id="app"]/div/form/div[2]/div[2]/div/div[1]/input').send_keys("HM_2023_test")# 点击登录
driver.find_element(By.XPATH, '//*[@id="app"]/div/form/div[2]/button').click()
time.sleep(3)# 实时展示监控页面信息
# 点击监控管理
# //*[text()='监控管理']
driver.find_element(By.XPATH, "//*[text()='监控管理']").click()
time.sleep(1)# 点击实时报警
# //*[contains(text(), '实时报警')]
driver.find_element(By.XPATH, "//*[contains(text(), '实时报警')]").click()
time.sleep(2)# 退出浏览器
quit_driver(driver)