哈喽!小伙伴们好,你们的朋友像疯一样!又来了,这次分享的是学习UI自动化测试环境和让小伙伴们感受到自动化测试的魅力,实现计算机控制网站。学习路上虽有困难,但是我们一起向前,加油!与前一期一样,文末会有小福利哟!
一、下载浏览器(Firefox、Chrome等浏览器)
Firefox浏览器下载地址:http://www.firefox.com.cn/
对应驱动下载地址:https://github.com/mozilla/geckodriver/releases
Chrome浏览器下载地址:https://www.google.cn/intl/zh-CN/chrome/
对应驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
IE浏览器驱动下载地址:http://selenium-release.storage.googleapis.com/index.html
Safari浏览器驱动下载地址:https://developer.apple.com/safari/resources/
二、安装开源ECShop网上商城管理系统
1.ECShop资源(下载安装到C盘):
链接:https://pan.baidu.com/s/1dVqiuxg9WDZX_ciupy3z-Q?pwd=n0cm
提取码:n0cm
2. 解压ECShop_V2.7.1_GBK_Release1228.zip,复制里面的三个文件夹到放在C:\wamp\www;
3. 访问服务环境时会报错:You don’t have permission to access / on this server.
解决方法:
修改位置一:
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
修改位置二:
# onlineoffline tag - don't remove
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Directory>
将上述两处的Deny from all 改为:Allow from all ,然后重新启动所有服务。
如果访问phpmyadmin时候,出现You don’t have permission to access /phpmyadmin/ on this server的提示,则打开xx:/wamp/alias/phpmyadmin.conf修改为:
<Directory "c:/wamp/apps/phpmyadmin3.5.1/">
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order Deny,Allow
Allow from all
Allow from 127.0.0.1
</Directory>
**注意:**如果电脑服务中有mysqlzt和MySQL,开启服务时需要关闭,因为两者冲突
查看电脑右下角存在绿色W图标代表启动成功。
- 安装界面 http://localhost/upload/install/index.php
- 进入后台 http://localhost/upload/admin/index.php
进入前台 http://localhost/upload/index.php
三、八种定位元素的方法
定位元素8种方法:
(1)id定位:利用元素的id属性值来进行定位(大多数情况id是唯一的,有id必用id,但是在现实中我见到的用id的不多)
--driver.find_element(By.ID,"id属性值")
(2)name定位:利用元素的name属性值来定位(name定位一般不准确,不建议使用)
--driver.find_element(By.NAME,"name属性值")
(3)link text定位:利用超级链接的完整文本来定位。(只能用于定位超级链接)
--driver.find_element(By.LINK_TEXT,"完整文本")
(4)partial link text定位:利用超级链接的一部分文本来进行定位
--driver.find_element(By.PARTIAL_LINK_TEXT,"部分文本")
(5)class name定位:使用元素的类名定位(不建议使用)
--driver.find_element(By.CLASS_NAME,"类名")
(6)tag name定位:使用元素的标记(标签)名称进行定位(不建议使用)
--driver.find_element(By.TAG_NAME,"标记名称")
(7)xpath定位:利用xpath表达式来进行定位(必会)
--driver.find_element(By.XPATH,"xpath表达式")
(8)CSS selector:利用CSS表达式来定位(可以先做了解)
-- driver.find.element(By.CSS.SELECTOR,"CSS表达式")
四、自动化实现各种特殊操作
1.下拉列表操作
from selenium import webdriver #导入webdriver驱动类
from selenium.webdriver.common.by import By #导入by,定位方法所必须关联的类
from time import sleep
from selenium.webdriver.support.select import Select #下拉列表的标记是select,官方提供了一个下拉列表的类,导入select
driver = webdriver.Firefox() #打开火狐浏览器
# 打开首页
driver.get("http://localhost/upload/index.php")
# 定位图中的下拉列表
pull_down_list = driver.find_element(By.ID, "category")
sleep(1)
# 对象实例化
living_example = Select(pull_down_list)
living_example.select_by_visible_text("充值卡")
sleep(2)
driver.quit()
2.切换frame
查看当前页面的frame是“header-frame”
想要定位到商品管理下的商品品牌,直接使用link_text定位肯定是定位不到的,看下图,因为他们不在同一个frame下,所以要切换到menu_frame下才能定位到商品品牌,同样想要使用自动化实现退出,也要在进去之后,再退出menu_frame,才能定位到退出按钮,可见如下代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Firefox()
driver.get("http://localhost/upload/admin/index.php")
driver.find_element(By.NAME, "username").send_keys("admin")
driver.find_element(By.NAME, "password").send_keys("admin123")
driver.find_element(By.NAME, "captcha").send_keys("0")
driver.find_element(By.XPATH, "//td[@style='padding-left: 50px']//input[@type='submit']").click()
sleep(3)
driver.switch_to.frame("menu-frame") #切换到menu_frame下
driver.find_element(By.LINK_TEXT, "商品品牌").click()
sleep(6)
# 切换回主网页
driver.switch_to.default_content()
sleep(3)
# 切换到上一个frame
driver.switch_to.frame("header-frame")
# 点击退出
driver.find_element(By.LINK_TEXT, "退出")
sleep(2)
driver.quit()
3.切换浏览器窗口
注意:页面切换和切换frame是一样的,必须切换到其所在的地方才能对其地方执行操作,就好像两个山大王,你在别人的地盘上没有得到允许干什么,你是不可以自主的去随意做事的,有严格的限制。
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Firefox()
driver.get("http://localhost/upload/index.php")
#获得当前窗口的句柄(每一个窗口的句柄都不同)
a=driver.window_handles
print(a)
driver.find_element(By.LINK_TEXT,"EC论坛").click()
sleep(5)
#切换到新窗口
b=driver.window_handles #代表获取所有窗口的句柄
c=b[-1] #c代表所有句柄的最后一个
driver.switch_to.window(c) #切换到c,也就是ec论坛的页面
#点击右上角的注册
driver.find_element(By.XPATH,'//div[@id="umenu"]/a[1]').click()
sleep(3)
driver.quit()#关闭本次运行脚本期间所启动的所有浏览器窗口
4.弹出框操作
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.get("http://localhost/upload/index.php")
# 点击搜索
driver.find_element(By.NAME, "imageField").click()
sleep(2)
# 切换到对话框
switchover = driver.switch_to.alert
a = switchover.text #获取到弹框的文本
print(a) #这里的打印,可以视为验证已经切换到alert了
# 点击确定关闭弹框
switchover.accept()
driver.quit()
5.等待操作
分为三种:
(1)强制等待:语法:from time import sleep
如果放在定位元素后,无论定位到还是没有定位到元素,设置睡眠15秒就一定会暂停15秒之后才会有后续操作,即使早已经找到定位的元素了。
(2)隐式等待:语法:driver.implicity_wait(超时时间)
与前者不一样的是,如果在上述语法中设置15秒的超时时间,如果在三秒的时候就找到元素了,在第四秒的时候就会执行后续的操作,如果在十五秒内一直找不到元素就会报错。较强制等待,隐式等待的效率得到了大大的提高。
(3)显示等待:
w1 = WebDriverWait(driver, 超时时间)
a1 = EC.frame_to_be_available_and_switch_to_it((By.ID, “header-frame”))
w1.until(a1)
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
#设置显示等待
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.maximize_window() #最大化窗口展示
driver.implicitly_wait(15) #隐式等待
driver.get("http://localhost/upload/admin/privilege.php?act=login")
driver.find_element(By.NAME, "username").send_keys("admin")
driver.find_element(By.NAME, "password").send_keys("admin123")
driver.find_element(By.NAME, "captcha").send_keys("0")
driver.find_element(By.XPATH, "//input[@value='进入管理中心']").click()
#等待商品回收站所属的frame出现代表登录成功
w2 = WebDriverWait(driver, 10)
a2 = EC.frame_to_be_available_and_switch_to_it((By.ID, "menu-frame"))
w2.until(a2)
driver.switch_to.default_content()
# 显示等待:等待退出所属的frame出现代表登录成功
w1 = WebDriverWait(driver, 10)
a1 = EC.frame_to_be_available_and_switch_to_it((By.ID, "header-frame"))
w1.until(a1)
driver.find_element(By.LINK_TEXT, "退出").click()
sleep(3)
driver.quit()
6.读取CSV格式文件
说明:
a.csv 文件里的所有数据在准备时,都不要加引号
b.CSV文件里的所有数据读取之后,默认是str类型
7.实现数据驱动–DDT
安装:管理员身份运行cmd,输入在线命令pip install ddt(检查是否安装成功–pip show ddt)
import unittest
from utils.read_csv import CSVUtil
from ddt import ddt,data,unpack #导入数据驱动所需的东西
from selenium.webdriver.common.by import By
from selenium import webdriver
from time import sleep
u=CSVUtil("..\\testdata\\login.csv") #CSVutil读取CSV文件,注意CSVutil是我定义的一个类,因为不是我自己写的那个类,从心里保证原创,如有需要可留言
d=u.get_list_data()
print(d)#为了调试,打印变量d的值
@ddt
class MyTestCase(unittest.TestCase):
def setUp(self) -> None: #当前行将多个用例都会执行的地方归整到一起,这样就不用写三遍打开火狐
self.driver=webdriver.Firefox()
self.driver.implicitly_wait(13)
def tearDown(self) -> None: #当前行与前者一样不用写三遍关闭浏览器了
self.driver.quit()
sleep(2)
@data(*d)
@unpack
def test_something(self,a,b):
#print(a,b) 调试
self.driver.get("http://localhost/upload/user.php")
self.driver.find_element(By.NAME,"username").send_keys(a)
self.driver.find_element(By.NAME,"password").send_keys(b)
self.driver.find_element(By.NAME,"submit").click()
#检查网页里包含“用户名和密码错误”
p1=self.driver.page_source
self.assertIn("用户名或密码错误",p1)
#检查标题是“系统提示”
t1=self.driver.title
b1=t1.startswith("系统提示")
self.assertTrue(b1)
sleep(6)
if __name__ == '__main__':
unittest.main()
看到最后了,如果有需要最后的那个CSVutil类的代码可留言,好了,本期到此为止,下期给小伙伴们分享UI自动化测试框架搭建,本小白也是初来乍到,如有错误,有则改之。同样送大家一个原创的图吧,希望能喜欢!下期再见!