【软件质量保证与测试】实验一、基于Selenium+Python的自动化测试

完整代码直接看结尾

一、实验课程的性质、目的和任务

(1)了解Selenium+Python环境搭建及配置,能够了解基于Selenium自动化测试的基本原理;
(2)能够理解基于Selenium自动登QQ邮箱并发送邮件的过程,对软件自动化测试过程的原理有一定的理解,为今后从事web自动化测试奠定基础。

二、实验环境

(1)window10操作系统;
(2)python开发环境

三、实验内容

能够安装python,conda及selenium环境,执行简单的自动化web程序。

四、实验步骤

准备工作:安装python,conda及pycharm

(1)使用pycharm创建工程
①选择File—>New Project
在这里插入图片描述
② 创建工程项目
1、为工程指定路径;2、选择conda环境3、选择python版本;4、选择conda执行路径
在这里插入图片描述
(2)在pycharm下面选择Terminal 标签
在这里插入图片描述
(3)使用pip安装selenium : pip install selenium
(4)打开Chrome浏览器,查看浏览器版本。找到【帮助】下的【关于Google Chrome】
在这里插入图片描述
在这里插入图片描述

(5)根据对应的版本选择相匹配的webdriver,网址为:http://chromedriver.storage.googleapis.com/index.html;

可惜没有我要的Win64位driver啊,可以直接使用Win32的
在这里插入图片描述

然后运行conda env list 结果如下:
在这里插入图片描述
然后把chromedriver.exe考入到Selenium环境所对应的目录里。

(10)运行如下代码会在控制台打印出网页源代码。

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
# 使用headless无界面浏览器模式
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

# 启动浏览器,获取网页源代码
browser = webdriver.Chrome(chrome_options=chrome_options)
mainUrl = "https://www.taobao.com/"
browser.get(mainUrl)
print(f"browser text = {browser.page_source}")
browser.quit()

控制台打印的网页源代码
在这里插入图片描述

基于Selenium自动登QQ邮箱并发送邮件

(1)浏览器打开QQ邮箱登录网址:QQ邮箱登录地址为:https://mail.qq.com/。选择账号密码登录
在这里插入图片描述

from selenium import webdriver
import time
QQEmail = webdriver.Chrome()
QQEmail.get('https://mail.qq.com/')

(2)元手动进入QQ邮箱登录网页,按下F12打开开发者工具,点击查看元素,选择元素:素定位,输入QQ账号和QQ密码
在这里插入图片描述
① 可以看到QQ账号输入框的id、name等属性,都是可以直接拿来定位的好选择。这里选择最通用的xpath方法来定位,id=‘u’,并用send事件输入QQ账号(也可以find_element_by_id(‘u’)来定位,代码更清晰,)

QQEmail.find_element_by_xpath('//*[@id="u"]').send_keys("QQ账号")

② QQ密码元素属性id=‘p’,同样定位方法

QQEmail.find_element_by_xpath('//*[@id="p"]').send_keys("密码")

③ 登录按钮元素属性id=‘login_button’,这里不需要发送信息,所以选择click点击事件

QQEmail.find_element_by_xpath('//*[@id="login_button"]').click()

原则上到此为止,运行pycharm应该是能够输入账号和密码,并登陆成功。但是事情没有那么简单,运行后发现,selenium报错,无法找到id为u的元素。原因在于控件输入框和密码框都在iframe框架内。在定位这些元素之前要转到这个frame。
在这里插入图片描述
④ 在定位元素之前,先输入如下代码:

# 定位login_frame
QQEmail.switch_to.frame("login_frame")

这样就切换到iframe了,再继续之前的元素定位,即可成功。这一步的完整代码为:

from selenium import webdriver
import time
QQEmail = webdriver.Chrome()
QQEmail.get('https://mail.qq.com/')

# 定位login_frame
QQEmail.switch_to.frame("login_frame")
# 定位账号、密码,并输入
QQEmail.find_element_by_xpath('//*[@id="u"]').send_keys("QQ账号")
QQEmail.find_element_by_xpath('//*[@id="p"]').send_keys("密码")
# 定位登录按钮
QQEmail.find_element_by_xpath('//*[@id="login_button"]').click()

这个时候网页已经可以成功QQ邮箱。

额,如果QQ邮箱出现了需要手动输入验证码的情况,这一步并不能自动登录QQ邮箱,最简单的解决方案是让程序sleep一会儿,手动输入验证码

(3)元素定位,写信界面
①邮箱登录成功之后,来到写信界面,按照常规操作,需要先点击左上角写信按钮,展开具体写信界面。同样的方法,F12操作起来,查看写信按钮,元素定位为id=‘composebtn’,发送点击事件。

# 定位写信按钮
QQEmail.find_element_by_xpath('//*[@id="composebtn"]').click()

②这个时候调试程序,网页成功打开结果为selenium定位不到id为composebtn的元素。这个时候就暴露了在上一个环节中出现的问题,之前的代码将嵌套切换到了iframe的login_frame中,而此时的写信元素,不在iframe中,所以在定位之前,需要先离开这个嵌套,返回到主文档中:

QQEmail.switch_to.default_content()

这样嵌套就切换到主文档了,再次运行程序,发现还是报错。登陆之后的瞬间就去定位写信按钮,这个时候受网速、PC的客观影响,会定位不到元素。只需要加一个sleep一秒,即可完美解决。

#离开login_frame
QQEmail.switch_to.default_content()
#等待一秒
time.sleep(1)
# 定位写信按钮
QQEmail.find_element_by_xpath('//*[@id="composebtn"]').click()

这样即可定位到写信按钮,进入到了发邮件的步骤。
(4)元素定位,邮件发送
在这里插入图片描述
邮件内容编辑有四个部分,收件人、主题、正文,以及最后点击发送按钮。通过之前踩的坑,到了这一步,我对iframe嵌套变得格外小心,准备定位的每个元素都去观察是否被iframe嵌套。果不其然,“收件人”、“主题”和“发送”被主文档下的mainFrame嵌套了,而“正文”又被mainFrame的子frame嵌套了。
这一步的逻辑为:
①先切换到mainFrame,
②分别定位 收件人 和 主题 ,调用发送事件
③继续切换到子frame
④定位正文,调用发送事件
⑤从子frame,返回到它的父frame,也即是mainFrame中
⑥定位发送按钮,调用点击事件

(5)定位收件人的时候,发现定位到的元素,还有子div,经过模拟,发现只有第二个子div才是真正能够定位到收件人的元素,于是先定位id=‘toAreaCtrl’,然后选择第二个div中的input作为定位。具体xpath定位内容为:“//*[@id=‘toAreaCtrl’]/div[2]/input”
在这里插入图片描述
(6)定位正文时,从mainFrame切换到iframe,发现iframe的id和name是动态的一串数字,但是switch_to.frame只支持固定id或者name。先用iframe的class进行xpath定位,然后把传给switch_to.frame来切换。具体为:

QQEmail.switch_to.frame(QQEmail.find_element_by_xpath('//*[@class="qmEditorIfrmEditArea"]'))

最后代码为

# 切换到mainFrame
QQEmail.switch_to.frame('mainFrame')
time.sleep(1)
# 定位收件人,并输入
QQEmail.find_element_by_xpath("//*[@id='toAreaCtrl']/div[2]/input").send_keys("收件人@qq.com")
# 定位主题,并输入
QQEmail.find_element_by_xpath('//*[@id="subject"]').send_keys("来自***的邮件")
# 定位邮件正文,先进入到iframe
QQEmail.switch_to.frame(QQEmail.find_element_by_xpath('//*[@class="qmEditorIfrmEditArea"]'))
# 必须先点击正文,再send_keys
QQEmail.find_element_by_xpath('/html/body').click()
QQEmail.find_element_by_xpath('/html/body').send_keys("Hello World","\n***")
# 返回到mainframe
QQEmail.switch_to.parent_frame()
# 定位发送按钮
QQEmail.find_element_by_xpath('//*[@name="sendbtn"]').click()

基于Selenium自动登QQ邮箱并发送邮件完整代码

from selenium import webdriver
import time
QQEmail = webdriver.Chrome()
QQEmail.get('https://mail.qq.com')
# 定位login_frame
QQEmail.switch_to.frame("login_frame")
# 定位账号、密码,并输入
QQEmail.find_element_by_xpath('//*[@id="u"]').send_keys("账号")
QQEmail.find_element_by_xpath('//*[@id="p"]').send_keys("密码")
# 定位登录按钮
QQEmail.find_element_by_xpath('//*[@id="login_button"]').click()

# 离开login_frame
QQEmail.switch_to.default_content()
# 等待一秒
time.sleep(1) # 如果需要手动输入验证码,就把时间设置长一些再定位到写信按钮
# 定位写信按钮
QQEmail.find_element_by_xpath('//*[@id="composebtn"]').click()
# 切换到mainFrame
QQEmail.switch_to.frame('mainFrame')
time.sleep(1)
# 定位收件人,并输入
QQEmail.find_element_by_xpath("//*[@id='toAreaCtrl']/div[2]/input").send_keys("收件人邮箱")
# 定位主题,并输入
QQEmail.find_element_by_xpath('//*[@id="subject"]').send_keys("来自***的邮件")
# 定位邮件正文,先进入到iframe
QQEmail.switch_to.frame(QQEmail.find_element_by_xpath('//*[@class="qmEditorIfrmEditArea"]'))
# 必须先点击正文,再send_keys
QQEmail.find_element_by_xpath('/html/body').click()
QQEmail.find_element_by_xpath('/html/body').send_keys("Hello World","\n***")
# 返回到mainframe
QQEmail.switch_to.parent_frame()
# 定位发送按钮
QQEmail.find_element_by_xpath('//*[@name="sendbtn"]').click()
  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值