【三:web自动化常用的操作】

一:什么web自动化测试

对网页的测试 UI测试: web测试+app测试 web自动化测试:通过代码对网页进行测试 UI测试=web自动化测试+APP自动化测试

二:selenium的三大组件

1、selenium IDE 浏览器插件:实现脚本录制
2、WebDriver 实现对浏览器的各种操作(API包)
3、Grid 分布式执行,用例同时在多个浏览器同时执行,提搞测试效率

三:web自动化测试环境搭建 环境搭建步骤

1、安装selenium(第三方库) cmd命令:pip install selenium
2、安装浏览器(谷歌浏览器) 常见浏览器:chrome浏览器、IE浏览器、Firefox浏览器
3、安装浏览器驱动
谷歌浏览器驱动:chromedriver.exe
IE浏览器驱动:ieserverdriver.exe
Firefox浏览器驱动:geckodirver.exe

特别注意事项:下载驱动版本必须与浏览器的版本一致 下载地址:http://npm.taobao.org/mirrors/chromedriver/ chromedriver.exe文件放置到python安装路径(python.exe所在的路径)

四:web自动化测试第一个脚本 打开浏览器,加载项目地址

五:浏览器的常用操作

"""
xpath定位

find_element_by_xpath基于这个方法来实现
"""

# 通过绝对路径定位
import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(2)

# 窗口最小化
driver.minimize_window()
#
# 窗口最大化
driver.maximize_window()

# 指定窗口的额大小
driver.set_window_size(2000,800)

# 返回
driver.back()

# 前景
driver.forward()

# 页面标题
driver.title

# 页面url
driver.current_url

# 页面源码
driver.page_source

# 截图保存为baidu.png
driver.get_screenshot_as_file(r"E:\PythonProject\web\baidu.png")

# 退出,关闭
driver.quit()
driver.close()

六、常用元素定位

定位常出现的问题
1、定位语句不对
2、是否加等待
3、元素嵌套在iframe/frame元素标签中(切换frame) 多层嵌套frame/iframe
4、要定位的元素非当前窗口(切换句柄)

1、web自动化测试就是通过代码对网页进行测试,在对网页进行测试之前,必须掌握如何 定位元素

2、元素定位的八大方法

1、基于id/name/class/tag_name定位
2、基于a标签元素的链接文本定位

# 元素的定位:
# id定位
driver.find_element(By.ID,'kw').send_keys("你好")


# # name 定位
# driver.find_element(By.NAME,'wd').send_keys("你好")


# # link_text定位
# driver.find_element(By.LINK_TEXT,'新闻').click()


# # partail_link_text定位
# driver.find_element(By.PARTIAL_LINK_TEXT,"新").click()

# xpath定位
#         绝对路径  /
#         相对路径  //
# 相对路径+索引定位
# driver.find_element(By.XPATH,"//form/span[1]/input").send_keys("黄小明")


# # 相对路径+属性定位
# driver.find_element(By.XPATH,"//input[@autocomplete='off']").send_keys("黄小明")


# # 相对路径+通配符定位
# driver.find_element(By.XPATH,"//*[@autocomplete='off']").send_keys("黄小明")


# # 相对路径+部分属性定位  #截取这个属性的值,定位已ff结尾的属性值
# driver.find_element(By.XPATH,"//*[starts-with(@autocomplete,'of')]").send_keys("黄小明")  #已什么开头
# driver.find_element(By.XPATH,"//*[substring(@autocomplete,2)='ff']").send_keys("黄小明") #已什么结尾
driver.find_element(By.XPATH,"//*[contains(@autocomplete,'of')]").send_keys("黄小明") #包含什么

driver.find_element(By.ID,'su').click()

# 相对路径 + 文本定位
# ualue=driver.find_element(By.XPATH,"//span[text()='按图片搜索']").get_attribute('class')
# print(ualue)


# css定位
#         绝对路径:一般不用
#         相对路径
# 相对路径通过id和class定位
# 通过属性定位
# 通过部分属性定位
# 查询字元素定位
# 查询兄弟节点定位

4、css定位

"""
css定位
基于find_element_by_css_selector()实现
"""
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

# 通过绝对路径进行定位 一般不用
el1 = driver.find_element_by_css_selector("html body div div div div div formspaninput")
el2 = driver.find_element_by_css_selector("html>body> div> div> div> div >div > form > span > input")

# 2通过id定位 #id属性值
# 3通过class属性定位 .class属性值 s_ipt
el3 = driver.find_element_by_css_selector("#kw")

el4 = driver.find_element_by_css_selector('.s_ipt')
# 4通过其他属性定位,并且多个属性定位
el5 = driver.find_element_by_css_selector("[autocomplete='off']")
el6 = driver.find_element_by_css_selector("[autocomplete='off'][class='s_ipt']")
# 5通过标签定位 标签名+属性/id/class进行定位 组合定位
el7 = driver.find_element_by_css_selector("input#kw")
el8 = driver.find_element_by_css_selector("input.s_ipt")
el9 = driver.find_element_by_css_selector("input[autocomplete='off']")

# 6通过层级定位 层级之间通过>或者空格隔开 相对路径
el10 = driver.find_element_by_css_selector("form#form>span>input#kw")

# 通过兄弟节点定位
# 场景:同一个元素下面多一个相同的元素 多胞兄弟
# 第一个元素 标签:first‐child
# 第二个元素 标签:nth‐child(n)
# 最后元素 标签:last‐of‐type

el11 = driver.find_element_by_css_selector("div#s‐top‐left>a:first‐child")
el12 = driver.find_element_by_css_selector("div#s‐top‐left>a:nth‐child(3)")

el13 = driver.find_element_by_css_selector("div#s‐top‐left>a:last‐of‐type")
# el13.click()
# el10.send_keys("chromedriver")
# time.sleep(2)
# driver.close()

"""
定位多个元素
"""
ellist = driver.find_elements_by_css_selector("#kw")
print(ellist)
# 返回WebElement
el14 = ellist[0]

"""
元素定位是否通过一个方法,支持所有的定位方式定位到元素
find_element()
find_elements() 基于多个定位方式找到一组元素
"""

el15 = driver.find_element(By.CSS_SELECTOR, "#kw")

el16 = driver.find_element(By.ID, "kw")

el14.send_keys("chromedriver")
time.sleep(2)
driver.close()


七、元素的常用操作

1、四大操作:

1、输入
2、点击
3、获取文本
4、获取属性


"""
元素四大操作
"""
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

driver=webdriver.Chrome()
 driver.get("http://www.baidu.com")
 time.sleep(2)
 el1=driver.find_element(By.ID,"kw")
 # 输入
 # el1.send_keys()
 # 点击
 # el1.click()
 # 获取元素文本内容
 el2=driver.find_element(By.LINK_TEXT,"新闻")
 print("打印该元素的文本内容:",el2.text)
 # 获取元素的属性
 print("获取autocomplete属性值:",el1.get_attribute("autocomplete"))

2、三大切换

1、切换窗口:当定位的元素不在当前窗口,则需要切换窗口

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

"""
元素等待:
 1、强制等待 time.sleep(秒数) 停留
 2、智能等待(隐士等待) driver.implicitly_wait(秒数) 给页面上所有的元素设置全
局等待时间
 只要在设置的时间范围内找到了元素,就会执行下一个代码,最多等待设置的时间
 3、显示等待 显示等待:等待当前需要操作的元素 基于多种条件+等待元素
 多种条件:等待元素可见?等待url跳转为xxx?等待新窗口出现?很多场景条件
 from selenium.webdriver.support.wait import WebDriverWait
 from selenium.webdriver.support import expected_conditions
 自动化测试框架脚本:
 以显示等待为主
 以强制等待为辅
 """


 driver=webdriver.Chrome()
 # 智能等待
 # driver.implicitly_wait(10)
 driver.get("http://www.baidu.com")
 # 输入搜索内容
 el1=driver.find_element(By.ID,"kw")
 el1.send_keys("chromedriver")
 #点击百度一下
 el2=driver.find_element(By.ID,'su')
 el2.click()
 # 显示等待
 loc=(By.LINK_TEXT,"ChromeDriver Mirror")
 # 等待元素存在
 WebDriverWait(driver,15,0.5).until(EC.presence_of_element_located(loc))
 # 点击搜索的内容
 el3=driver.find_element(*loc)
 el3.click()
 # 新打开的窗口里面定位元素 需要切换窗口
 # 获取浏览器窗口列表 最早打开的窗口放到list的最前面
 wins=driver.window_handles
 print(wins)
 # 切换最后打开的窗口
 driver.switch_to.window(wins[‐1])

 el4=driver.find_element(By.LINK_TEXT,"2.0/")
 el4.click()
 # 为了看到效果
 time.sleep(3)
 driver.close()

2、切换iframe:当定位的元素在frame/iframe,则需要切换

 """
定位的元素包含在iframe/frame标签里面
切换到iframe/frame
"""
import time

from selenium.webdriver.common.by import By
from selenium import webdriver

 driver=webdriver.Chrome()
 driver.get("https://ke.qq.com/?tuin=80805fad")

 driver.find_element(By.ID,"js_login").click()
 time.sleep(2)
 # 切换iframe 方式一:id
 # driver.switch_to.frame("id")

 # 切换iframe 方式二:索引 索引值从0开始
 driver.switch_to.frame(1)

 # 切换iframe 方式三:找到iframe元素
 # driver.switch_to.frame(driver.find_elements(By.XPATH,"//iframe")[2])

 # 再定位元素
 driver.find_element(By.LINK_TEXT,"帐号密码登录").click()
 time.sleep(2)
 driver.close()

3、切换弹出窗口

3、元素三大等待

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

"""
元素等待:
 1、强制等待 time.sleep(秒数) 停留
 2、智能等待(隐士等待) driver.implicitly_wait(秒数) 给页面上所有的元素设置全
待时间
 只要在设置的时间范围内找到了元素,就会执行下一个代码,最多等待设置的时间
 3、显示等待 显示等待:等待当前需要操作的元素 基于多种条件+等待元素
 多种条件:等待元素可见?等待url跳转为xxx?等待新窗口出现?很多场景条件
 from selenium.webdriver.support.wait import WebDriverWait
 from selenium.webdriver.support import expected_conditions
 自动化测试框架脚本:
 以显示等待为主
 以强制等待为辅
 """


 driver=webdriver.Chrome()
 # 智能等待
 # driver.implicitly_wait(10)
 driver.get("http://www.baidu.com")
 # 输入搜索内容
 el1=driver.find_element(By.ID,"kw")
 el1.send_keys("chromedriver")
 #点击百度一下
 el2=driver.find_element(By.ID,'su')
 el2.click()
 # 显示等待
 loc=(By.LINK_TEXT,"ChromeDriver Mirror")
 # 等待元素存在
 WebDriverWait(driver,15,0.5).until(EC.presence_of_element_located(loc))
 # 点击搜索的内容
 el3=driver.find_element(*loc)
 el3.click()
 # 新打开的窗口里面定位元素 需要切换窗口
 # 获取浏览器窗口列表 最早打开的窗口放到list的最前面
 wins=driver.window_handles
 print(wins)
 # 切换最后打开的窗口
 driver.switch_to.window(wins[‐1])

 el4=driver.find_element(By.LINK_TEXT,"2.0/")
 el4.click()
 # 为了看到效果
 time.sleep(3)
 driver.close()

八、弹框的处理

import time

from selenium.webdriver.common.by import By
from selenium import webdriver

driver=webdriver.Chrome()
driver.get(r"C:\Users\xingyao\Desktop\test.html")

 el=driver.find_element(By.ID,"1")
 time.sleep(2)
 el.click()
 # 弹窗进行处理
 alert=driver.switch_to.alert
 print(alert.text)
 # 点击确认
 # alert.accept()

 time.sleep(2)
 driver.close()

九、下拉框的操作

 """
 实现下拉框的操作
 from selenium.webdriver.support.select import Select
 """
 from selenium.webdriver.support.select import Select

 import time

 from selenium.webdriver.common.by import By
 from selenium import webdriver

 driver=webdriver.Chrome()
 driver.get(r"C:\Users\xingyao\Desktop\test.html")

 # 定位下拉框
 el1=driver.find_element(By.ID,"banji")
 select=Select(el1)
 # 展示下拉框所有选项内容显示
 print("展示下拉框所有选项内容",select.options)
 time.sleep(2)

 # 实现选择下拉框选项选择 有三种方式 索引 value 选项内容
 select.select_by_index(1)
 time.sleep(2)
 select.select_by_value("22")
 time.sleep(2)
 select.select_by_visible_text("全栈VIP23期")
 time.sleep(2)
 driver.close()

十、键盘操作

 """
 键盘操作

 """
 import time

 from selenium import webdriver
 from selenium.webdriver.common.by import By
 from selenium.webdriver.common.keys import Keys
 driver=webdriver.Chrome()
 driver.get("https://www.baidu.com")
 driver.find_element(By.ID,"kw").send_keys("码尚教育")
 time.sleep(2)
 # ctrl+a
 driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'a')

 # ctrl+c
 driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'c')
 # ctrl+x
 driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'x')
 driver.find_element(By.ID,"kw").clear()
 time.sleep(2)
 # ctrl+v
 driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'v')

 time.sleep(2)
 driver.close()

十一、鼠标操作

"""
鼠标操作
ActionChains 动作链
可以把多个鼠标操作按照顺序连贯的统一执行
"""
from selenium.webdriver import ActionChains


import time

from selenium.webdriver.common.by import By
from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
time.sleep(2)
el_set=driver.find_element(By.ID,"s‐usersetting‐top")

# 第一种写法,合起来写
# ActionChains(driver).move_to_element(el_set).perform()

# 第二种写法
actions=ActionChains(driver)
actions.move_to_element(el_set)
actions.perform()
time.sleep(1)
el_gjselect=driver.find_element(By.LINK_TEXT,"高级搜索")
el_gjselect.click()
time.sleep(2)
driver.close()

"""
ActionChains 常用的鼠标操作方法
鼠标常用操作:
滑块操作
click_and_hold 点击鼠标左键不松开
context_click 鼠标右击
double_click 双击
drag_and_drop 从一个元素拖到鼠标到另外一个元素
drag_and_drop_by_offset 拖到某个坐标松开
move_by_offset 鼠标从当前位置移动到某个坐标
move_to_element  鼠标移动到某个元素
move_to_element_with_offset 移动到距某个元素(左上角坐标)多少距离的位置
pause 停留
release 释放鼠标
"""

十二、日期控件

只读控件的日期控件,如何实现输入? javascript 实现 调用execute_script

"""
js操作
execute_script
"""

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.12306.cn/index/")
time.sleep(2)

# 只读日期控件元素
el_data = driver.find_element(By.ID, "train_date")

# 去掉readonly属性‐‐‐》通过js操作元素driver.execute_script()
# arguments 把execute_script后面的第二个或者第三个或者到第n个参数到放在arguments
js = "var el=arguments[0];el.removeAttribute('readonly');"

# 执行js脚本,去掉readonly属性
driver.execute_script(js, el_data)

# 清除日期控件默认值
el_data.clear()
time.sleep(2)

# # 日期控件输入设置的日期
el_data.send_keys('2021‐10‐01')
print("时间控件设置的日期:", el_data.get_attribute("value"))

十三、滚动条操作

什么情况下,需要把元素放到可见区域我才可以操作呢? 懒加载/慢加载 必须把元素移动可见区域,才会实现加载 ----》滚动条操作

"""
滚动条操作
"""
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element(By.ID, "kw").send_keys("selenium webdriver")
driver.find_element(By.ID, "su").click()
loc = (By.XPATH, "//div[@id='7']/h3/a")

# 显示等待 presence_of_element_located不一定元素可见,只要存在即可
WebDriverWait(driver, 15).until(EC.presence_of_element_located(loc))
el2 = driver.find_element(*loc)
time.sleep(2)
# el2.click()

# 实现滚动条从顶部到底部
driver.execute_script("scrollTo(0,document.body.scrollHeight)")
time.sleep(2)

# 实现滚动条从浏览器底部到顶部
driver.execute_script("scrollTo(document.body.scrollHeight,0)")
time.sleep(2)

# 操作哪个元素,滚动条移动到元素附近(元素与页面的顶部对齐,元素与页面的底部对
js2 = "arguments[0].scrollIntoView(false);"
driver.execute_script(js2, el2)
time.sleep(2)

十四、文件上传

"""
文件上传操作

类型一:支持直接输入

类型二:不可以直接输入,只能选择
"""
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By


# 类型一:支持直接输入
driver=webdriver.Chrome()
driver.get(r"E:\VIP\M211\web\WebCode\class06\test.html")
time.sleep(4)
el_file=driver.find_element(By.ID,"f1")
el_file.send_keys(r"E:\VIP\M211\web\WebCode\class06\test.html")
time.sleep(2)
driver.close()

# 类型二:不可以直接输入,只能选择
# 如何定位windows窗口及窗口的元素?
# 环境准备
# 1、定位工具(失败window窗口及元素)‐‐‐winSpy
# 2、第三方库 pywin3
# 安装: pip install pywin3
# 切换源 pip install ‐i https://pypi.douban.com/simple pywin3
# 如何定位windows窗口及窗口的元素?
#文件上传输入框: #32770‐ComboBoxEx32 ‐ComboBox ‐Edit
# 打开按钮:#32770‐Button

import win32gui
import win32con

driver=webdriver.Chrome()
driver.get(r"E:\VIP\M211\web\WebCode\class06\test.html")
time.sleep(4)
el_file=driver.find_element(By.ID,"f1")
ActionChains(driver).move_to_element(el_file).click().perform()
def upload(filePath,browser_type="Chrome"):
    if browser_type == "Chrome":
        title = "打开"
    else:
        title = "文件上传"
    # 32770‐ComboBoxEx32 ‐ComboBox ‐Edit
    dialog = win32gui.FindWindow("#32770", title)  # 一级窗口 ‘打开窗口’
    ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None)  # 二级
    ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, "ComboBox", None)  # 三级
    edit = win32gui.FindWindowEx(ComboBox, 0, "Edit", None)  # 四级
    # 32770‐Button
    button = win32gui.FindWindowEx(dialog, 0, "Button", None)  # 四级
    # 往文件名编辑框中输入文件路径
    # 上传操作
    win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filePath)
    win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)  # 点击打开按钮

    filepath = r"E:\VIP\M211\web\WebCode\class06\test.html"
    time.sleep(5)
    upload(filePath=filepath)
    print("文件上传成功")
    time.sleep(10)

同时打开多个页签

from selenium import webdriver
js="window.open('{}','_blank');"
#第一个网站
driver=webdriver.Chrome()
driver.get('http://web1.com')
driver.find_element_by_id('username').send_keys('user1')
driver.find_element_by_id('password').send_keys('pass1')
driver.find_element_by_tag_name('form').submit()  	#表单提交
#第二个网站
driver.execute_script(js.format('http://web2.com'))
driver.switch_to.window(driver.window_handles[-1])    #切换到最新页面
driver.find_element_by_id('userid').send_keys('user2')
driver.find_element_by_id('pwd').send_keys('pass2')
driver.find_element_by_id('Submit').click()		#点击按钮
#第三个网站 
driver.execute_script(js.format('http://wweb3.com')
driver.switch_to.window(driver.window_handles[-1])    #切换到最新页面
if 'login' in driver.current_url:		#默认打开页面后会自动跳转到登录页
  driver.find_element_by_id('_umname').send_keys('user3')
  driver.find_element_by_id('pwd').send_keys('pass3')
  driver.find_element_by_id('submit').click()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leoon123

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值