自动化测试

目录

安装Selenium IDE

使用 Selenium IDE

安装kataon

使用kataon

 selenium测试环境搭建

webdriver api学习

定位元素的方式

 页面元素操作

浏览器操作

鼠标操作

键盘操作

警告窗口处理

多表单处理

元素等待


自动化测试就是用程序(脚本)测试程序

安装Selenium IDE

1.使用谷歌安装,下载地址:Download Selenium IDE 3.17.2 CRX File for Chrome - Crx4Chrome

 2. 直接打开谷歌浏览器,打开右上角扩展程序,手动将下载的crx文件拖到页面上

 3.点击图标即可运行

使用 Selenium IDE

 1.在新项目中记录新测试

2.测试名称

 3.添加url,然后点击START RECORDING按钮开始录制屏幕

3. 录制好屏幕后,添加功能名称

 

 4.创建好项目后,可添加对应步骤描述,然后点击运行

可以将多余的步骤删除:

 5.一个完整的测试用例,应该包括:步骤(command、 target.、value) 、断言(预期和
实际对此)。
添加断言:

1)点击空白行

 2)添加内容:

  • 在Command处选择assert text 选项;
  • 在Target处使用选择目标箭头在页面上选择元素
  • 在页面上复制预期的某个结果
  • 添加描述

注:以下第一个按钮是选择目标箭头(执行一遍程序后才能使用此项),第二个按钮是将选择的目标重新定位在页面中。

 6.添加好断言后,重新运行程序,如果程序通过,则断言文本文字变成绿色: 

 如果程序未通过,则断言文本文字变成红色:

断言要求:不需要多,一个就够了,只要能够唯一确定你的脚本是通过的即可。

安装kataon

1.使用谷歌安装,下载地址:Download Katalon Recorder 5.9.0 CRX File for Chrome - Crx4Chrome

 2. 直接打开谷歌浏览器,打开右上角扩展程序,手动将下载的crx文件拖到页面上

3.点击图标可运行

使用kataon

 1.创建测试用例

 2.点击Record录制屏幕

3.添加断言(需要先执行一遍程序

使用以下按钮选择Target

 如果测试通过,断言文本文字变成绿色:

  如果测试未通过,断言文本文字变成红色:

3.导出文件

选择以下选项

 selenium测试环境搭建

1.安装selenium(在pycharm中安装):

    1)检测python位置:where python

    2)安装:pip3 install selenium

2.下载chromeDriver驱动:https://chromedriver.chromium.org/

选择接近谷歌版本的chromeDriver:

 选择对应操作系统的下载:

 将下载的文件解压后放在python安装目录:

第一个自动化脚本

'''
    需求:百度文本框输入selenium . 点击百度一下
        1、百度文本框
        2、百度一下
        使用ID属性定位:
            1、确定要操作的对象
            2、获取id属性(kw\su)
            3、其他操作
'''

# 导包
from selenium import webdriver
import time
from selenium.webdriver.common.by import By

# 创建浏览器对象
driver = webdriver.Chrome()
# 打开百度首页
driver.get("https://www.baidu.com")
# 在搜索框输入关键字selenium
driver.find_element(By.ID, "kw").send_keys("selenium")
# 时间延迟两秒
time.sleep(2)
# 点击搜索按钮
driver.find_element(By.ID, "su").click()
time.sleep(2)
# 关闭浏览器
driver.quit()

webdriver api学习

定位元素的方式

from selenium.webdriver.common.by import By

# 1.使用id定位
find_element(By.ID,"kw")

# 2.使用name定位
find_element(By.NAME,"wd")

# 3.使用class定位
find_element(By.CLASS_NAME,"s_ipt")

# 4.使用标签定位
find_element(By.TAG_NAME,"input")

# 5.使用link_text定位
find_element(By.LINK_TEXT,"新闻")

# 6.使用partial_link_text定位
find_element(By.PARTIAL_LINK_TEXT,"新")

# 7.通过XPATH定位

# 1)使用绝对路径:从根节点(html)开始从上往下找,同一层级相同标签用排名表示,如div[1]、div[2],第一个标签可不用排名,直接写div。
driver.find_element(By.XPATH, '/html/body/div/div/div[5]/div/div/form/span/input').send_keys("selenium")

# 2)利用元素属性定位:固定格式://input[@]
driver.find_element(By.XPATH, '//input[@name="wd"]').send_keys('selenium')

# 3)利用父子关系以及元素属性定位
# * 表示所有 不确定是什么标签的时候使用
# driver.find_element(By.XPATH, '//*[@id="form"]/span/input').send_keys('selenium')
# 确定了标签就直接写标签名
# driver.find_element(By.XPATH, '//form[@id="form"]/span/input').send_keys('selenium')

# 4)使用逻辑运算符以及元素属性定位 使用and或or
# driver.find_element(By.XPATH, '//input[@id="kw" and @name="wd"]').send_keys('selenium')
driver.find_element(By.XPATH, "//input[@id='kw' or @name='wd']").send_keys('selenium')

# 8.使用css定位
find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su")

css定位说明

选择器:

  • .  类选择器
  • #  id选择器
  • *  通配符选择器
  • tag 标签选择器
  • >  儿子选择器
  • +  兄弟选择器
  • [name='kw']  属性选择器

CSS与XPATH的类似功能对比:

 页面元素操作

1. clear()  清除文本。

# 定位百度搜索框
driver.find_element(By.ID, "kw").send_keys("selenium")
# 清楚百度搜索框
driver.find_element(By.ID, 'kw').clear()
# 点击搜索按钮
driver.find_element(By.ID, 'su').click()

2. send_keys (value)  模拟按键输入。

3. click()  单击元素。例如按钮操作。

4.current_url  返回当前页面的url地址,用来做断言,判断是否符合预期结果。

# 导包
from selenium import webdriver
import time
from selenium.webdriver.common.by import By

# 创建浏览器对象,并打开百度首页
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

# 点击百度首页上的新闻按钮,要获取跳转后页面的url地址,并且判断是否符合预期结果
driver.find_element(By.LINK_TEXT, '新闻').click()
# 新闻跳转后会重新打开一个页面,需要增加一条语句
driver.switch_to.window((driver.window_handles[1]))

# 获取跳转后新闻页的url
url = driver.current_url
print(url) # https://news.baidu.com/

# 添加断言
if url == 'https://news.baidu.com/':
    print('跳转成功')
else:
    print('跳转失败')

# 关闭浏览器
time.sleep(3)
driver.quit()

5. title  返回当前页面的title。

# 获取跳转页面后的title
title = driver.title
print(title) # 百度新闻——海量中文资讯平台

6. text  获取页面(提示框、警告框)显示的文本

# 获取百度首页文本:换一换
txt = driver.find_element(By.XPATH, '//*[@id="hotsearch-refresh-btn"]/span').text
print(txt) # 换一换

7. get_attribute()  获得属性值,文本框中的值使用value属性名。

# 获取百度输入框的name和class
# value1 = driver.find_element(By.ID, 'kw').get_attribute('name')
# print(value1) # wd
value1 = driver.find_element(By.ID, 'kw').get_attribute('class')
print(value1) # s_ipt
# 获取百度输入框的值
value2 = driver.find_element(By.ID, 'kw').get_attribute('value')
print(value2) # 123

8. is_displayed()  判断该元素是否可见;is_enabled()  判断元素是否可用;is_selected()  判断是否选中,一般用复选框或者单选框的判断。

# 判断百度首页是否有搜索按钮
res = driver.find_element(By.ID, 'su').is_displayed()
print(res) # True
# 判断百度首页搜索按钮是否可用
res = driver.find_element(By.ID, 'su').is_enabled()
print(res) # True

浏览器操作

1.控制浏览器窗口大小

# 设置打开的窗口为1920*600
driver.set_window_size(1920, 600)
# 最大化显示窗口
driver.maximize_window()
# 最小化窗口
driver.minimize_window()

2.控制浏览器前进、后退

# 点击百度首页的新闻
driver.find_element(By.LINK_TEXT, '新闻').click()
driver.switch_to.window((driver.window_handles[1]))
time.sleep(2)
# 后退到首页
driver.back()
time.sleep(2)
# 又前进到新闻页
driver.forward()
time.sleep(2)

说明:句柄

driver.switch_to.window((driver.window_handles[1]))

只要打开新窗口,就需要添加对应窗口的句柄。所有句柄是一个列表,需要取对应窗口句柄值就使用下标取值。

获取句柄:driver.window_handles

绑定句柄到对应窗口:driver.switch_to.window

3.刷新页面

driver.refresh()

4.屏幕截屏

driver.find_element(By.LINK_TEXT, '新闻').click()
# 新闻跳转后会重新打开一个页面,需要增加一条语句
driver.switch_to.window((driver.window_handles[1]))
# 跳转到新闻页后截屏 三种方式
# driver.save_screenshot(r"D:\software-test\auto_test\news.png")
# driver.get_screenshot_as_file(r"D:\software-test\auto_test\news1.png")
driver.get_screenshot_as_file("{}.{}".format(r'D:\software-test\auto_test\news3', 'png'))

说明:

print("{ }.{ }".format(1, 2)      // 1.2

 { }.{ } 表示格式,. 表示拼接符,format 里面的参数表示数据,会一一对应到{ }中。

5.关闭浏览器

# 不管有几个窗口,都会关闭
# driver.quit()
# 只关闭一个窗口,第一个
driver.close()

鼠标操作

导包:from selenium.webdriver.common.action_chains import ActionChains

perform(): 执行所有ActionChains中存储的行为,常见方法:

1.context_click()  右击

2.double_click()  双击

3.drag_and_drop()  拖动

4.move_to_element()  鼠标悬停

# move_to_element 鼠标悬浮
# context_click(txt) 鼠标右击

# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time


# 创建浏览器对象,并打开百度首页
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
time.sleep(3)
driver.maximize_window()

# 将鼠标悬浮到百度首页文本“设置”上
setBtn = driver.find_element(By.XPATH, '//*[@id="s-usersetting-top"]')
ActionChains(driver).move_to_element(setBtn).perform()
time.sleep(3)

# 在百度文本框中鼠标右键
txt = driver.find_element(By.ID, 'kw')
ActionChains(driver).context_click(txt).perform()

driver.quit()

键盘操作

导包:from selenium.webdriver.common.keys import Keys

1.send_keys(Keys.Back_SPACE)  删除键

2.send_keys(Keys.SPACE)  空格键

3.send_keys(Keys.TAB)  制表键

4.send_keys(Keys.ESCAPE)  esc键

5.send_keys(Keys.ENTER)  回车4.键

6.send_keys(Keys.CONTROL , 'a’)  全选

7.end_keys(Keys.CONTROL, 'c')  复制

8.send_keys(Keys.CONTROL, ' x’)  剪切

9.send_keys(keys.CONTROL,  'v’)  粘贴

'''
键盘事件案例:
    1、百度搜索框输入“seleniumm”
    2、删除多输入的m
    3、再输入" 教程”
    4、ctrl+a,全选文本框内容
    5、 ctrl+x,剪切选择的内容
    6、ctrl+v。粘贴复制的内容
    7、回车代替单击,完成搜索
    8、退出浏览器
'''

# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

# 创建浏览器对象,并打开百度首页
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

# 1、百度搜索框输入“seleniumm”
driver.find_element(By.ID, 'kw').send_keys('seleniumm')
time.sleep(1)
# 2、删除多输入的m
driver.find_element(By.ID, 'kw').send_keys(Keys.BACK_SPACE)
time.sleep(1)
# 3、再输入 " 教程” ,再次输入字符串是拼接,而不是覆盖!!
driver.find_element(By.ID, 'kw').send_keys(' 教程')
time.sleep(1)
# 4、ctrl + a,全选文本框内容
driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'a')
time.sleep(1)
# 5、 ctrl + x,剪切选择的内容
driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'x')
time.sleep(1)
# 6、ctrl + v 粘贴复制的内容
driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'v')
time.sleep(1)
# 7、回车代替单击,完成搜索
driver.find_element(By.ID, 'kw').send_keys(Keys.ENTER)
time.sleep(1)
# 8、退出浏览器
driver.quit()

警告窗口处理

在WebDriver中处理JavaScript所生成的alert、confirm、prompt,具体做法是使用switch to.alert。

方法定位到 alert/confirm/prompt后,可以使用:

  • text  获取 alert/confirm/prompt 中的文字信息。
  • accept()  接受现有警告框。
  • dismiss()  放弃现有警告框。
  • send_keys(keysToSend)  发送文本至警告框。
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time


# 创建浏览器对象,并打开百度首页
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()

# 定位到文本”设置“
set = driver.find_element(By.XPATH, '//*[@id="s-usersetting-top"]')
# 鼠标移动到“设置”上,显示下拉框,目的是将文本“搜索设置”显示出来
ActionChains(driver).move_to_element(set).perform()
time.sleep(2)

# 点击“搜索设置” ,操作元素之前,必须先使元素显示出来!!
driver.find_element(By.XPATH, '//*[@id="s-user-setting-menu"]/div/a[1]/span').click()
time.sleep(2)

# 点击保存设置按钮
driver.find_element(By.XPATH, '//*[@id="se-setting-7"]/a[2]').click()
time.sleep(2)

# 将弹框交给浏览器
dd = driver.switch_to.alert
# 获取弹框文本信息
txt = dd.text
print(txt) # 已经记录下您的使用偏好

# 确认弹框
dd.accept()
# 放弃弹框
# dd.dismiss()

driver.quit()

注:操作元素之前,必须先使元素显示出来!!

多表单处理

在Web应用中经常会遇到 frame/iframe 表单嵌套页面的应用,WebDriver 对于 frame/iframe 表单内嵌页面上的元素无法直接定位。就需要通过switch_to.frame() 方法将当前定位的主体切换为 frame/iframe 表单的内嵌页面中。
有两种解决方式:

  • 默认可以给iframe标签的id或name
  • 可以传参iframe的元素对象
'''
多表单〔在一个窗口上) :
    在一个页而中可以嵌套另外一个页面,如frame/iframe技术,这是现在很多web应用中使用的一种方式,
    webdriver对象只能在页画〈外层是默认的)中定位元素,
    需要一种方式将driver对象从外层切换给内层使用才能对内层的对象进行处理。
    webdriver中提俱APi: driver.switch_to.frame(实现
    案例:
    1.打开腾讯首页: http://www.qq.com
    2.点击部箱图标;
    3.输入用户名:
    4.输入密码;
    5.点击登录;
    6.关闭浏览器。
'''

# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 创建浏览器对象,并打开腾讯qq首页
driver = webdriver.Chrome()
driver.get('https://www.qq.com')
driver.maximize_window()
time.sleep(2)

#2.点击邮箱图标,跳转到登录界面(新窗口);
driver.find_element(By.XPATH, '//*[@id="top-login"]/div[2]/a').click()
driver.switch_to.window(driver.window_handles[1]) # 句柄
time.sleep(2)

# 3.输入用户名:
# 先切换到账号密码登录 不能定位到该文本,涉及到多表单的处理,使用driver.switch_to.frame()解决
# 第一种方式:默认可以给iframe标签的id或name
# driver.switch_to.frame('login_frame')
# 第二种方式,可以传参iframe的元素对象
obj = driver.find_element(By.XPATH, '//*[@id="login_frame"]')
driver.switch_to.frame(obj)
# 定位文本“账号密码登录”
driver.find_element(By.XPATH, '//*[@id="switcher_plogin"]').click()
# 输入用户名
driver.find_element(By.XPATH, '//*[@id="u"]').send_keys('3600262327')
# 4.输入密码;
driver.find_element(By.XPATH, '//*[@id="p"]').send_keys('123456')
time.sleep(2)

# 5.点击登录;
driver.find_element(By.XPATH, '//*[@id="login_button"]').click()
time.sleep(2)

# 6.关闭浏览器。
driver.quit()

元素等待

如今很多web都在使用AJAX技术,运用这种技术的软件当浏览器加载页面时,页面上的元素可能不会被同步加载完成,因此,webDriver提供了三种元素等待方式

1.强制等待(休眠): time.sleep(2)。直接让线程休眠。

2.隐式等待:driver.implicity_wait(2)。在脚本创建driver对象之后,给driver设置一个全局的等待时间,对driver的整个生命周期(创建到关闭)都起效,所有元素都等待。如果在设置等待时间(超时时间)内,定位到了页面元素,则不再等待,继续执行下面的代码。如果超出了等待时间,则抛出异常。

方法:

  • webDriverwait(driver,timeput, poll_frequency=0.5,ignored_exceptions=None),第二个参数:超时时间;第三个参数:频率,即多长时间刷新一次;第四个参数:默认值。
  • util(method ,info): 直到满足某一个条件,返回结果,等不到就抛错
  • until(EC.presence_of_element_located(locator)) 判断某个元素是否定位到了 ;locator-->By.ID, By.NAME
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 等待十秒

3.显示等待:就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception。(简而言之,就是直到元素出现才去操作,如果超时则报异常)

注意:
若同时设置了隐式等待和显示等待,则以隐式等待为第一优先级,也就是说,若隐式等待时间大于显示等待,显示等待时间设置无效,因为driver若找不到元素,会先等待隐式等待的时间。对time.sleep()没有影响。只要执行到这句代码,就会等待。

# 导包
from selenium import webdriver
from selenium.webdriver.support.ui import  WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 隐式等待
# driver.implicitly_wait(10) # 等待十秒

# 显示等待
'''
WebDriverWait(driver, 10, 0.5, ignored_exceptions=None)
util(method ,info): 直到满足某一个条件,返回结果,等不到就抛错
until(EC.presence_of_element_located(locator)) 判断某个元素是否定位到了
  locator-->By.ID, By.NAME

需求:
    使用显示等待的方式去等百度首页的百度一下按钮显示出来,
    如果出来就点击,否则print()
'''
searchBtn = WebDriverWait(driver, 10, 0.5, ignored_exceptions=None).until(EC.presence_of_element_located((By.ID, 'kw')), '报错')
if searchBtn:
    searchBtn.send_keys('selenium')
    time.sleep(2)
else:
    print(searchBtn)
    time.sleep(2)


driver.quit()


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值