对象:Tpshop商城
需求:更换头像
操作步骤:
个人信息–头像–上传图片–图片确认–确认保存
核心代码:
# 进入frame框架[不熟]
driver.switch_to.frame(driver.find_element_by_xpath('//*[@id="layui-layer-iframe1"]'))
driver.find_element_by_xpath('//*[@id="filePicker"]/div[2]/input').send_keys('C:\\Users\\S3214\\Pictures\\Camera Roll\\boy.jpg')
# 法1:直接定位“确认”按钮
driver.find_element_by_xpath('//*[@id="uploader"]/div[1]/div[3]/div[3]').click()
# 法2:【鼠标操作】双击该“确认”按钮
# double = driver.find_element_by_xpath("//*[@id='uploader']/div[1]/div[3]/div[3]")
sleep(5) #注意设置等待时间!
# ActionChains(driver).double_click(double).perform()
driver.switch_to.default_content()
完整代码:
# coding:utf-8
from time import sleep
from selenium import webdriver
# 打开浏览器
from selenium.webdriver import ActionChains
driver = webdriver.Chrome()
#隐性等待
driver.implicitly_wait(10)
# 打开网址
driver.get("http://localhost/index.php")
# 打开登录页面
driver.get("http://localhost/index.php/Home/user/login.html")
# 输入文字为了登陆成功
driver.find_element_by_xpath('//*[@id="username"]').send_keys('13800138006')
driver.find_element_by_xpath('//*[@id="password"]').send_keys('123456')
driver.find_element_by_xpath('//*[@id="verify_code"]').send_keys('8888')
driver.find_element_by_xpath('//*[@id="loginform"]/div/div[6]/a').click()
# 校验用户是否正确
# name = driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div[1]/div[2]/a[1]')
name = driver.find_element_by_class_name('mu-m-phone').text
if name == 'hello':
print('登录成功')
else:
print('账号不匹配,请查看:%s' % name)
# 上传头像
driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[1]/div/ul[4]/li[2]/a').click()
driver.find_element_by_id('preview').click()
# 进入frame框架[不熟]
driver.switch_to.frame(driver.find_element_by_xpath('//*[@id="layui-layer-iframe1"]'))
driver.find_element_by_xpath('//*[@id="filePicker"]/div[2]/input').send_keys('C:\\Users\\S3214\\Pictures\\Camera Roll\\boy.jpg')
# 法1:直接定位“确认”按钮
driver.find_element_by_xpath('//*[@id="uploader"]/div[1]/div[3]/div[3]').click()
# 法2:【鼠标操作】双击该“确认”按钮
# double = driver.find_element_by_xpath("//*[@id='uploader']/div[1]/div[3]/div[3]")
sleep(5) #注意设置等待时间!
# ActionChains(driver).double_click(double).perform()
driver.switch_to.default_content()
sleep(5)
driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div/div[2]/form/ul[5]/li[2]/div[3]/input').click()
法1:直接法
# 法1:直接定位“确认”按钮
driver.find_element_by_xpath('//*[@id="uploader"]/div[1]/div[3]/div[3]').click()
法2:鼠标事件(双击)
# 法2:【鼠标操作】双击该“确认”按钮
double = driver.find_element_by_xpath("//*[@id='uploader']/div[1]/div[3]/div[3]")
sleep(5) #注意设置等待时间!
ActionChains(driver).double_click(double).perform()
知识点:
IFrame切换
driver.switch_to.frame(driver.find_element_by_xpath('//*[@id="layui-layer-iframe1"]'))
switch_to.frame
:切换到iFrame
switch_to.default_content()
:跳到最外层(切换到主窗口)
switch_to.parent_frame()
:切换到上一级父窗口
鼠标操作
Selenium工具中全局鼠标操作语法如下:
第1步:初始化ActionChians类(动作链条):actions=ActionChains(driver)
第2步:找到要操作的元素:find_element
第3步:调用鼠标操作方法:actions.move_to_element(element)
第4步:执行鼠标操作方法:actions.perform()
参考文章:selenium之鼠标操作详解
续写参考文章:自动化测试po模式是什么
-----2024-4-26------
需求:加入购物车
卡点 :去购物车结算"按钮无法直接定位
解决思路:鼠标双击?定位不到–>frame跳转页面 报错
技术参考文章:3种定位方法
待处理页面:
源码
Code:
# frame跳转页面
driver.switch_to.frame()
driver.switch_to_default.content()
driver.switch_to.window(driver.window_handles[0])
driver.find_element_by_xpath("//*[@id='addCartBox']/div[1]/div/div/a[2]").click()
运行结果1:
TypeError: frame() missing 1 required positional argument: 'frame_reference'
AI答案:
说实在,AI回答得太空泛了,真不好用。
他人经验:
原因:
调用类的函数时,没有先对类进行实例化,直接调用,就会报错
解决:
先对类进行实例化,再调用实例的函数
运行结果2:
'SwitchTo' object has no attribute 'default'
太鸡肋了,AI提示的解决措施不适用在我的代码上。
已解决:
# frame跳转页面[成功]
driver.switch_to.frame(driver.find_element_by_xpath('//*[@id="layui-layer-iframe1"]')) #找到iframe框架
driver.find_element_by_xpath("//*[@id='addCartBox']/div[1]/div/div/a[2]").click() #定位文字
driver.switch_to.default_content()
更新代码
原始版
# coding:utf-8
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
# 打开浏览器
driver = webdriver.Chrome()
# 最大化
driver.maximize_window()
#隐性等待
driver.implicitly_wait(10)
# 打开网址
driver.get("http://localhost/index.php")
# 打开登录页面
driver.get("http://localhost/index.php/Home/user/login.html")
# 输入文字为了登陆成功
driver.find_element_by_xpath('//*[@id="username"]').send_keys('13800138006')
driver.find_element_by_xpath('//*[@id="password"]').send_keys('123456')
driver.find_element_by_xpath('//*[@id="verify_code"]').send_keys('8888')
driver.find_element_by_xpath('//*[@id="loginform"]/div/div[6]/a').click()
# 校验用户是否正确
# name = driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div[1]/div[2]/a[1]')
name = driver.find_element_by_class_name('mu-m-phone').text
if name == 'hello':
print('登录成功')
else:
print('账号不匹配,请查看:%s' % name)
# 上传头像开始
driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[1]/div/ul[4]/li[2]/a').click()
driver.find_element_by_id('preview').click()
# 进入frame框架[不熟]
driver.switch_to.frame(driver.find_element_by_xpath('//*[@id="layui-layer-iframe1"]'))
driver.find_element_by_xpath('//*[@id="filePicker"]/div[2]/input').send_keys('C:\\Users\\S3214\\Downloads\\boy.jpg')
# 法1:直接定位“确认”按钮【图片未上传成功】
# driver.find_element_by_xpath('//*[@id="uploader"]/div[1]/div[3]/div[3]').click()
# 法2:【鼠标操作】双击该“确认”按钮【成功】
double = driver.find_element_by_xpath("//*[@id='uploader']/div[1]/div[3]/div[3]")
sleep(7) #注意设置等待时间!
ActionChains(driver).double_click(double).perform()
driver.switch_to.default_content()
# 确认保存
driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div/div[2]/form/ul[5]/li[2]/div[3]/input').click()
# 上传头像结束
# 加入购物车开始
driver.get("http://localhost/index.php/Home/User/info.html")
driver.find_element_by_xpath("//*[@id='q']").send_keys("手机")
driver.find_element_by_xpath("//*[@id='sourch_form']/a").click()
driver.find_element_by_xpath("/html/body/div[4]/div/div[2]/div[2]/ul/li[2]/div/div[5]/div[2]/a").click()
driver.find_element_by_xpath("//*[@id='join_cart']").click()
sleep(3)
#出错:“去购物车结算”按钮无法直接定位--->鼠标双击看看?不行-->frame跳转页面
#直接定位:失败
# driver.find_element_by_xpath("//*[@id='addCartBox']/div[1]/div/div/a[2]").click()
# frame跳转页面 报错:TypeError: frame() missing 1 required positional argument: 'frame_reference'
# frame跳转页面[成功]
driver.switch_to.frame(driver.find_element_by_xpath('//*[@id="layui-layer-iframe1"]')) #找到iframe框架
driver.find_element_by_xpath("//*[@id='addCartBox']/div[1]/div/div/a[2]").click() #定位文字
driver.switch_to.default_content()
# 提交订单
driver.find_element_by_xpath("//*[@id='ng-app']/body/div[2]/div[1]/div[2]/div/div/div/div/div[3]/a[2]").click()
sleep(3)
driver.find_element_by_xpath("//*[@id='cart2_form']/div/div[2]/div[2]/div/a/span").click()
# 加入购物车结束
Pages
# coding:utf-8
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
class Commerce:
"""
菜鸟小王,Tpshop电商购物自动化
pageobject封装
powered by Ms.Judy
2024/4/26
"""
def __init__(self):
self.driver = webdriver.Chrome()
# 最大化
self.driver.maximize_window()
# 隐性等待
self.driver.implicitly_wait(10)
# 打开网址
self.driver.get("http://localhost/index.php")
def login(self,lname,lpw,lvc):
# 打开登录页面
self.driver.get("http://localhost/index.php/Home/user/login.html")
# 输入文字为了登陆成功
self.driver.find_element_by_xpath('//*[@id="username"]').send_keys(lname)
self.driver.find_element_by_xpath('//*[@id="password"]').send_keys(lpw)
self.driver.find_element_by_xpath('//*[@id="verify_code"]').send_keys(lvc)
self.driver.find_element_by_xpath('//*[@id="loginform"]/div/div[6]/a').click()
# 校验用户是否正确
name = self.driver.find_element_by_class_name('mu-m-phone').text
if name == 'hello':
print('登录成功')
else:
print('账号不匹配,请查看:%s' % name)
def uplode_img(self,img_path):
# 上传头像开始
self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[1]/div/ul[4]/li[2]/a').click()
self.driver.find_element_by_id('preview').click()
# 进入frame框架[不熟]
self.driver.switch_to.frame(self.driver.find_element_by_xpath('//*[@id="layui-layer-iframe1"]'))
self.driver.find_element_by_xpath('//*[@id="filePicker"]/div[2]/input').send_keys(img_path)
double = self.driver.find_element_by_xpath("//*[@id='uploader']/div[1]/div[3]/div[3]")
sleep(7) # 注意设置等待时间!
ActionChains(self.driver).double_click(double).perform()
self.driver.switch_to.default_content()
# 确认保存
self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div/div[2]/form/ul[5]/li[2]/div[3]/input').click()
# 上传头像结束
def shopping(self,goods):
# 加入购物车开始
self.driver.get("http://localhost/index.php/Home/User/info.html")
self.driver.find_element_by_xpath("//*[@id='q']").send_keys(goods)
self.driver.find_element_by_xpath("//*[@id='sourch_form']/a").click()
self.driver.find_element_by_xpath("/html/body/div[4]/div/div[2]/div[2]/ul/li[2]/div/div[5]/div[2]/a").click()
self.driver.find_element_by_xpath("//*[@id='join_cart']").click()
sleep(3)
# frame跳转页面[成功]
self.driver.switch_to.frame(self.driver.find_element_by_xpath('//*[@id="layui-layer-iframe1"]')) # 找到iframe框架
self.driver.find_element_by_xpath("//*[@id='addCartBox']/div[1]/div/div/a[2]").click() # 定位文字
self.driver.switch_to.default_content()
# 提交订单
self.driver.find_element_by_xpath("//*[@id='ng-app']/body/div[2]/div[1]/div[2]/div/div/div/div/div[3]/a[2]").click()
sleep(5)
self.driver.find_element_by_xpath("//*[@id='cart2_form']/div/div[2]/div[2]/div/a/span").click()
# 加入购物车结束
Runner
# utf-8
from web.Pages import Commerce
page = Commerce()
# 登录 (账号,密码,验证码)
page.login('13800138006','123456','8888')
# 上传头像
page.uplode_img('C:\\Users\\S3214\\Downloads\\boy.jpg')
# 加入购物车
page.shopping('手机')
结构组成:
“”"
组成:
继承unittest.TestCase
初始化setUp
结束teardown
测试方法testxxxx
“”"