PO框架【自动化测试】

对象: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
“”"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值