接口测试---UI自动化

UI自动化测试

  • 分类 : web自动化与移动自动化,不关注底层代码实现

  • 概念 : 使用程序,脚本对系统界面体现的功能和数据信息展示等进行的测试技术

  • 什么样的项目适合UI自动化?

    • 项目周期长

    • 所要实现的UI自动化界面流程或功能需求变更不频繁

    • 项目需要历史功能回归测试

  • 什么时候执行UI自动化测试?(手工测试结束后)

    • 项目在迭代时,手工测试任务完成

    • 迭代过程还有空余时间,UI自动化测试脚本编写

  • selenium核心组件

    • selenium-IDE : 脚本录制

    • selenium-Gird : 分布式执行UI自动化测试脚本工具

    • selenium - webdriver : selenium所提供编写代码的第三方包,模拟手工操作.

  • 部署环境步骤

  1. 安装python,浏览器,selenium等

  2. 确认浏览器版本号,下载对应版本(版本大差不差就行)的浏览器驱动程序,并将浏览器驱动程序放在python安装目录下,http://chromedriver.storage.googleapis.com/index.html

[自动化测试脚本编写步骤]
"""web自动化代码"""
# 1.导入模块
from time import sleep

from selenium import webdriver
# 2.实例化浏览器对象:类名()
driver=webdriver.Chrome()	# 谷歌浏览器
# driver=webdriver.Firefox()	# 火狐浏览器

# 3.打开网页:必须包含协议头
driver.get('http://www.baidu.com')

# 4.观察效果
sleep(3)

# 5.关闭页面
driver.quit()

元素定位方式

id定位
通过元素id来定位元素,要求元素有id属性且id属性唯一,优先使用id
定位:
driver.find_element(By.ID,'属性值').send_keys('传入值')
"""登录tpshop商城"""
# 导包
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# 构建浏览器对象
driver=webdriver.Chrome()

# 访问网页
driver.get("https://hmshop-test.itheima.net/Home/user/login.html")

# 找到元素填入账号密码验证码
driver.find_element(By.ID,'username').send_keys('13739717401')
driver.find_element(By.ID,"password").send_keys('123456')
driver.find_element(By.ID,'verify_code').send_keys('8888')

# 点击登录按钮
driver.find_element(By.XPATH,'//*[@id="loginform"]/div/div[6]/a').click()

# 停留时间查看
time.sleep(5)

# 关闭
driver.quit()
Name定位
根据name属性定,name属性可以重复
注意:name属性值可能重复,确定能够代表目标元素唯一性之后,再用
	多个元素的特征值相同时,默认获取第一个符合要求的特征对应元素
driver.find_element(By.NAME,'username').send_keys('13739717401')
driver.find_element(By.NAME,"password").send_keys('123456')
class_name定位
1.名是class_name,使用时找元素class属性值
2.如果元素class属性值存在多个值,只能使用其中一个,要确认唯一性
  • 这里class_name的属性都相同,故不能使用
    image
driver.find_element(By.CLASS_NAME,'text_cmu').send_keys('13739717401')
tag_name标签名定位方法

如果存在多个相同的标签,返回符合条件的第一个标签,重复性太高一般不使用

link_text:只针对超链接元素(a 标签),需要文本的全部信息

partial_link_text:针对超链接元素,只需要传入超链接的部分文本信息,确定唯一性文本信息连续
driver.find_element(By.PARTIAL_LINK_TEXT,'登录').click()
driver.find_element(By.LINK_TEXT,"关于百度").click()
driver.find_element(By.PARTIAL_LINK_TEXT,"关于").click()
定位一组元素(存在多个特征值相同的元素)
  • 使用find_elements提取一类,使用列表[下标]提取相关元素输入值
# 访问获取元素
element=driver.find_elements(By.TAG_NAME,"input")
print(type(element))
element[0].send_keys("13739717401")
# 打印数据类型
<class 'list'>
----------------------------------
# 或改为,当下获取时输入
element=driver.find_elements(By.TAG_NAME,"input")[1].send_keys("123456")
print(type(element))

元素定位Xpath---出现层级结构使用

定位元素没有id,name,class属性或无法通过name,class,tag_name定义到唯一的元素时,启用XPath
路径定位-copy
1> 绝对路径:(较严格,不建议使用)  /html/body/div/fieldset/p[1]/input
2> 相对路径:匹配任意层级,不限制元素位置  //input或//*
3> copy XPath是相对路径,full XPath是相对路径,部分元素只能获取绝对路径,两选项结果可能相同
  • tpshop登录
# 导包
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# 获取浏览器对象
driver=webdriver.Chrome()

# 访问网址
driver.get("https://hmshop-test.itheima.net/Home/user/login.html")

# 获取xpath并填入数据
driver.find_element(By.XPATH,'//*[@id="username"]').send_keys("13719717401")
driver.find_element(By.XPATH,'//input[@id="password"]').send_keys("123456")
driver.find_element(By.XPATH,'//*[@id="verify_code"]').send_keys("8888")

time.sleep(3)

# 关闭链接
driver.quit()
元素属性定位
  • 复制相对应的元素属性

image
这里如果匹配为type就是//*[@type="password"]

格式: //任意层级 * 任意标签名
//input[@属性名='属性值'] 	# 匹配的是input标签类
//*[@属性名='属性值']                # 不限制标签名是什么
driver.find_element(By.XPATH,'//input[@id="account"]').send_keys('admin')
driver.find_element(By.XPATH,'//*[@id="account"]').send_keys('admin')
注意事项:
1> 有些目标的属性名和属性值,可能存在多个相同特征的元素,需要注意唯一性
2> 与class_name方法不同的事,如果出现具有多个值的class属性,需要传入全部的属性值
元素属性与逻辑结合(增加限制条件)

image

格式://*[@属性名='属性值' and @属性名='属性值']
说明:解决元素之间相同属性重名问题,多个属性值从属于同一个元素
格式://*[@type='text' and @autofocus='autofocus']
# 注: 多个属性值由and连接,每一个属性都要由@开头,可根据需求使用多个属性值
元素属性与层级结合
元素自身信息不方便定位到该元素,可以先定位到父级元素,再找该元素
语法:父层级定位策略/目标元素定位策略
//*[@id='p1']/input      # input是标签,没必要再写

# XPath祖辈和后代关系,只需要使用//连接祖辈和后代元素即可
'//form//*[@id="account"]'	//是任意层级
Xpath延伸
# 利用元素的文本定位
//*[text()="文本信息"] : 通过文本信息定位目标元素(要求全部内容)
# 点击进入禅道登陆页面
driver.find_element(By.XPATH, '//*[text()="开源版"]').click()

# 利用局部元素定位
//*[contains(@属性名,'属性值的部分内容')] : 通过给定属性值的部分内容进行元素定位
# 在禅道登录页面写入密码
driver.find_element(By.XPATH, '//*[contains(@id,"pass")]').send_keys('密码')

# 利用局部属性定位
//*[starts-with(@属性名,'属性值的开头部分内容')] :  通过给定属性值的开头部分内容进行元素定位
# 禅道登录页面写入账号admin
driver.find_element(By.XPATH, '//*[starts-with(@id,"acc")]').send_keys('admin')
  • 示例1:
# 使用局部属性定位的方式定位用户名输入框输入13719717401
driver.find_element(By.XPATH,'//*[contains(@name,"user")]').send_keys('13719717401')
# 使用开始局部属性定位元素
driver.find_element(By.XPATH,'//*[starts-with(@type,"pass")]').send_keys('123456')
# 使用文本定位的方式实现定位超链接
driver.find_element(By.XPATH,'//*[text()="淘宝网"]').click()
  • 示例2:
# 访问网址
driver.get("https://hmshop-test.itheima.net/Home")
# 使用xpath文本定位策略定位登录超链接
driver.find_element(By.XPATH,'//*[text()="登录"]').click()
# 使用xpath 属性定位 用户输入框写入账号
driver.find_element(By.XPATH,'//*[@id="username"]').send_keys('13719717401')
# 使用xpath 属性包含定位框定位密码输入框 写入密码
driver.find_element(By.XPATH,'//*[contains(@name,"pass")]').send_keys('123456')
# 使用xpath 层级与逻辑结合策略定位验证码输入框 写入8888
driver.find_element(By.XPATH,'//*[@class="text_cmu" and @name="verify_code"]').send_keys('8888')
# 使用xpath 层级与属性结合 定位登录按钮 并点击
driver.find_element(By.XPATH,"//*[@class='login_bnt']/a").click()

CSS----根据元素值定位元素

说明:通过css的选择器语法定位元素,更推荐css定位器,效率更高
方法:driver.find_element(By.CSS_SELECTOR,'值')
css选择器
1.ID选择器: #id属性值
2.class选择器: .class其中一个属性值
3.属性选择器: [属性名="属性值"] 或 标签名[属性名="属性值"],若使用class,则必须写入全部class的属性值
4.元素选择器: 标签名

------------------------------------------------------
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By

# 启动浏览器驱动
driver = webdriver.Chrome()

# 打开网页
driver.get('http://127.0.0.1:81/index.php')

# 使用css定位方式中id选择器,选择开源版按钮,并点击
driver.find_element(By.CSS_SELECTOR,'#open').click()

# 使用id选择器定位账号输入框,输入admin
driver.find_element(By.CSS_SELECTOR,'#account').send_keys('admin')

# 使用属性选择器定位密码输入框,输入Hjq123456
driver.find_element(By.CSS_SELECTOR,'[type="password"]').send_keys('mima1111')

# 使用元素定位器点击登录按钮
driver.find_element(By.CSS_SELECTOR,'button').click()

# 使用class选择器点击登录
driver.find_element(By.CSS_SELECTOR,'.toolbar-item').click()

sleep(10)
# 关闭浏览器
driver.quit()
层级选择器
  • 父子关系
父子辈关系选择
格式1:
	element1>element2	# 通过element1来定位element2,并且element2必须为element1的直接子元素
eg:	p[id='p1']>input	<定位指定p元素下的直接子元素input>
  • 层级关系
祖后辈----中间可以间隔多层
格式2:
	element1 element2 	#通过element1来定位element2,并且element2为element1的后代元素
eg:
	p[id='p1'] input	<定位指定p元素下的后代元素input>
  • 示例1:
!!!! 注意://*[id="username"]>input是错误写法

# 使用层级选择器爷孙选中输入框输入信息
driver.find_element(By.CSS_SELECTOR,'div input').send_keys('13719717401')
# 使用层级选择器父子关系选中验证码框输入验证码
driver.find_element(By.CSS_SELECTOR,'div[class="text_uspa check_cum"]>input').send_keys('8888')
  • css延伸
# 标签名[属性名^=属性值开头的部分内容] : 根据给出的属性值开头部分内容定位元素
driver.find_element(By.CSS_SELECTOR,'[id^="pas"]').send_keys('mima1111')

# 标签名[属性名$=属性值结尾的部分内容] : 根据给出的属性值开头部分内容定位元素
driver.find_element(By.CSS_SELECTOR,'[id$="rd"]').send_keys('mima1111')

# 标签名[属性名*=属性值任意部分内容] : 根据给出的属性值开头部分内容定位元素
driver.find_element(By.CSS_SELECTOR,'[id*="ss"]').send_keys('mima1111')

# 属性与逻辑结合[属性名1=属性值1][属性名2=属性值2]
如何选择合适的定位方式?

1> 优先ID,再看Name--> Class属性

2> 无class看其它属性

3> 单个属性不行就看多个

4> 属性不能精准定位时,使用层级

5> 看文本

6> 出现一样的内容,使用一组元素定位,通过下标选择

元素操作和元素信息获取

!!!!!都是element.方法名!!!!!
返回元素大小:size
获取元素文本:text
# 注:size与text为属性,调用时无括号xxx.size
传属性名获取属性值:get_attribute('xxx')
元素是否启用编辑:is_enabled()
元素是否显示:is_displayed()
元素是否被选中,检查复选框或单选框:isSelected()
  • 示例
# 返回元素大小:size
user=driver.find_element(By.ID,'account')
user.send_keys("admin")
print('输出元素尺寸:',user.size)
pwd=driver.find_element(By.ID,'password')
pwd.send_keys("mima1111")
print('密码输出元素尺寸:',pwd.size)

# 获取元素文本:text
btn=driver.find_element(By.ID,'submit')
print('目标元素的文本为:',btn.text)

# 传属性名获取属性值:get_attribute('xxx')
link=driver.find_element(By.LINK_TEXT,'淘宝网')
print('目标元素的地址为:',link.get_attribute('href'))

浏览器操作

# 写在创建驱动对象后
# 设置浏览器显示操作
1.最大化模式窗口 : driver.maximize_window()

# 浏览器显示页面操作
2.刷新 refresh() : driver.refresh()
# 3.1 title获取页面标题
print('关闭前页面标题',driver.title)

# 3.2 current_url 获取页面url
print('获取网页地址',driver.current_url)

# 4. close()关闭当前窗口-->模拟点击浏览器关闭按钮
# 说明:在没有实现浏览器页面切换操作前,close()方法关闭的是原始页面
driver.close()

页面交互操作

下拉框
  • 分类:

    • 自定义 : 通过div等布局标签设计的下拉框
    • html下拉框 : <select>+<option>
  • 下拉框处理方式 :

    • 自定义或者html下拉框可以通过元素定位方式实现
    • 针对原生态的<select>标签下拉框提供了select对象实现
  • 示例1:元素定位实现

# 打开hao123网站
driver.get("https://www.hao123.com")
time.sleep(3)
# 点击「切换」城市按钮,进入选择城市下拉框
driver.find_element(By.CSS_SELECTOR,"[monkey='weather']").click()
# 选天津
driver.find_element(By.CSS_SELECTOR, '[value="03"]').click()
time.sleep(3)
# 选择上海
driver.find_element(By.CSS_SELECTOR, '[value="02"]').click()
time.sleep(3)
# 选重庆
driver.find_element(By.CSS_SELECTOR, '[value="04"]').click()
通过select类实现
# 1.导包
from selenium.webdriver.support.select import Select
# 2.实例化对象
select=Select(element)
	1> element:<select>标签对应的元素,通过元素定位方法获取
	eg:element = driver.find_element(By.ID,'selectA')

# 3.操作方法
1.select_by_index(index)		# 根据option索引来定位,从0开始
2.select_by_value(value)	        # 根据option属性value定位
3.select_by_visible_text(text)		# 根据option显示文本定位
  • 示例:
# 更换城市
driver.find_element(By.CSS_SELECTOR,'[monkey="weather"]').click()
# 定位到更换城市的下拉框
element=driver.find_element(By.CSS_SELECTOR,'[name="province"]')

# 实例化select对象
select=Select(element)
# 调用select方法-- 位序--由0开始
select.select_by_index(3)
sleep(3)

# 调用select方法-- 数值
select.select_by_value('02')
sleep(3)

# 调用select方法-- 文本
select.select_by_visible_text('S 上海')
弹出框
系统弹窗(JS实现)----鼠标右键点击无反应
1.alert   警告框
2.confirm 确认框
3.prompt  提示框
自定义弹窗(前端代码封装)-->通过鼠标右键检查获取元素信息,直接定位目标元素操作移除弹窗
# 处理方式---获取弹出框对象
alert=driver.switch_to.alert
调用
alert.text()	# 获取alert/confirm/prompt中的文字信息
alert.accept()	# 接受弹出框选项
alert.dismiss()	# 取消
滚动条处理
  • 应用场景: 1.页面元素动态显示,根据滚动条下拉而被加载,2.页面同意条款,滚动到最底层才能点击同意
1、定义js字符串
      js = "window.scrollTo(0, 2000)"  # 如果想要移动到最下方,y值给最大值就可以实现
2、执行JS字符串
      driver.execute_script(js)
  • 示例:
# 执行JS--有横向和纵向
js_down = "window.scrollTo(0, 2000)"
driver.execute_script(js_down)

# 反向归零即可
js_up = "window.scrollTo(0, 0)"
driver.execute_script(js_up)
鼠标操作
鼠标悬停 点击 右击 左击 拖拽等
操作鼠标的方法封装在ActionChains类中
# 1.实例化一个对象
action=ActionChains(driver)
# 2.关联浏览器对象,方法调用传元素对象
# 3.使用策略:定位目标元素--创建对象--调方法--传目标元素
1.context_click(element)		右击-->模拟鼠标右键点击效果
2.double_click(element)			双击-->模拟鼠标双击效果
3.drag_and_drop(source,target)	        拖动-->模拟鼠标拖动效果
4.move_to_element(element)		悬停-->模拟鼠标悬停效果
5.perform()				执行-->此方法用于执行以上所有鼠标操作
  • 示例1:实现鼠标悬停
# 实现鼠标悬停!!
# 定位目标元素
user=driver.find_element(By.NAME,'tj_briicon')
# 创建鼠标对象
action=ActionChains(driver)
# 调用悬停方法
action.move_to_element(user)
# 执行命令
action.perform()
  • 示例2:实现鼠标右击
# 1.1 定位目标元素
username=driver.find_element(By.ID,'chat-textarea')
# 1.2 实例化鼠标对象,关联浏览器对象
action=ActionChains(driver)
# 1.3 调用鼠标方法
action.context_click(username)
# 1.4 执行--必须调用
action.perform()
  • 示例3:实现鼠标双击选中
# 1.1 定位目标元素
username=driver.find_element(By.ID,'chat-textarea')
username.send_keys("121331")
# 1.2 实例化鼠标对象,关联浏览器对象
action=ActionChains(driver)
# 1.3 调用鼠标方法
action.double_click(username)
# 1.4 执行--必须调用
action.perform()
  • 示例4:实现鼠标拖拽
# 大多用于手机端,web端很少
source=driver.find_element(By.ID,"div1")
target=driver.find_element(By.ID,"div2")
action.drag_and_drop(source,target)

其它重要API

元素等待
  • 概念:定位页面元素时未定位到,会在指定时间内一直等待
隐式等待
  • 隔一段时间自己定位一次元素,超出固定时长后,抛出元素不存在NoSuchElementException,针对全部
driver.implictly_wait(timeout)	# timeout为等待最大时长,单位:秒
说明:隐式等待为全局变量(只需设置一次)
说明:隐式等待被激活时,目标元素已出现,但由于页面其它元素未加载完成,会继续等待,进而增加代码的执行时长
  • 示例:
# 隐式等待---!!!!写在这对后面所有元素都生效!!!!
driver.implicitly_wait(30)
# 1.1 开始执行定位的当前时间
print("start_time:",time.strftime("%Y-%m-%d %H:%M:%S"))
# 1.2 定位延时加载输入框输入123456
driver.find_element(By.CSS_SELECTOR,"[class='chat-input-textarea']").send_keys("123456")
# 1.3 结束执行当前定位的时间
print("end_time:",time.strftime("%Y-%m-%d %H:%M:%S"))
显式等待
  • 能定到元素则当下返回,不能则设置间隔时间再去定位元素,达到最大时长还没找到元素时,则抛出异常TimeoutException,但只针对一个元素
实现:
# 1.导包 等待类 
from selenium.webdriver.support.wait import WebDriverWait
2.WebDriverWait(driver,timeout,poll_frequency=0.5)
		1> driver:浏览器驱动对象
		2> timeout:超时的时长,单位:秒
		3> poll_frequency=0.5:检测频率,默认0.5s
3.调用方法: until(method):直到...时
		1> method:函数名称,该函数用于实现元素的定位
		2> 一般使用匿名函数实现:lambada x:x.find_element(By.ID,'xxx')
4.element=WebDriverWait(driver,10,1).until(lambda x:x.find_element(By.ID,'xxx'))
# 1是时间间隔,10是总共时长,隔一秒定位一次.
# 定位延时加载输入框,找不到时抛出异常并捕获
try:
  el=WebDriverWait(driver,10,1).until(lambda x:x.find_element(By.ID,'TANGRAM__PSP_11__userName'))
  el.send_keys("admin")
except Exception as e:
  print("显式等待定位超时")
  # 继续抛出异常
  raise e
  • 区别:
    image
窗口切换,Frame方法
frame是一种框架,用于在当前页面指定区域显示另一页面元素
<iframe name="xxx" src="xxx" width="xxx" height="xxx"></iframe>
目标元素可以获取,代码执行无法定位,需要从获取元素对应代码开始向上查找,看是否存在iframe标签!!!若存在于frame中则先执行切换frame操作,传入的是代表frame元素唯一的特征值,再定位元素.
# 切换方法
1> driver.switch_to.frame(frame_reference)	---> 切换到指定frame框架
	frame_reference:可以为frame框架的name,id或者定位到的frame元素
2> driver.switch_to_default_content()		---> 恢复默认页面方法!!!!!!
	在frame中操作其他页面,必须先回到默认页面,才能进一步操作
  • 示例分析
# 如果目标中存在于frame中,就需要先执行切换frame操作,再定位元素
# 切换frame,传入的是能代表frame唯一性的特征值
driver.switch_to.frame('frame22')
# 注册单中填写页面B的注册信息
driver.find_element(By.ID,'userA')
driver.find_element(By.ID,'password')
# 切换回默认页面,如果连续切换多个frame,必须回到之前的默认页面,才能实现切换下一个frame
driver.switch_to.default_content()
# 切换frame
driver.switch_to.frame('frame33')
# 注册单中填写页面B的注册信息
driver.find_element(By.ID,'user3A')
driver.find_element(By.ID,'password')
窗口截图(我这个无显示,需要再修改)
# 代码自动执行报错的打印信息不完全明确,执行出错时对当前窗口截图保存,可直观看出原因
driver.get_screenshot_as_file(imgpath)	#imgpath是图片保存路径(手工提前创建)
  • 示例:
import time
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.implicitly_wait(10)
driver.get('https://www.baidu.com/')

try:
    driver.find_element(By.XPATH,'//*[@id="k"]').send_keys("demo")
except Exception as error:
    # 使用png格式,./为当前路径,../为上一级路径
    filename=f"./img/{time.strftime('%H%M%S')}.png"
    driver.get_screenshot_as_file(filename)

sleep(3)
driver.quit()
验证码处理(做回归测试)
  • 测试处理验证码方式:

    • 去掉验证码/验证码识别(不建议)

    • 记录cookie

cookie跳过登录

步骤 :

  1. 手工登录

  2. 获取cookie(询问研发,确认系统是否使用cookie技术进行登录用户身份验证,系统能否用cookie跳过登录)

  3. 脚本添加cookie

  4. 刷新页面

操作方法:

  • 手工登陆系统获取记录用户身份凭证的cookie信息

  • 通过脚本打开系统网站driver.get()打开浏览器

  • 通过selenium所提供的方法将手工拿到的cookie信息添加到脚本打开的浏览器中

  • 重新发起请求刷新页面

获取cookie : 除了cookie,还有token和jession的方式

  • 找开发确认是否用cookie,找记录用户登录状态cookie的name,手工登录获取cookie信息,添加获取cookie完成登录请求

  • 百度:记录用户身份凭证的cookie的name叫BDUSS

    • 使用driver.add_cookie(字典格式)添加cookie到浏览器中

    • 使用driver.get_cookie("BDUSS")

    • 刷新页面请求driver.refresh()即可完成登录请求

扩展--文件上传
  • <input>标签文件上传:使用send_keys()
element.send_keys("文件完整路径名")
  • <input>标签文件上传
模拟清除默认文本
element.clear()
Frame框架
  • 概念: frame是一种框架,在当前页面中显示另一个页面的内容(网页嵌套)

  • 形式:

    • frameset形式

    • iframe标签形式

Frame方法:(看到当前区域与周围区域样式不同,先进行frame切换)

  • 切换指定iframe
driver.switch_to.frame(frame_reference)  #frame_reference:iframe标签元素对象
  • 恢复默认页面
driver.switch_to.default_content()

切换到A界面后,恢复至默认页面后才能再次切换到B界面

  • 示例frame切换:
driver.get("https://qzone.qq.com/")

# 切换至frame框架
driver.switch_to.frame(driver.find_element(By.ID,"login_frame"))
# 点击密码登录
driver.find_element(By.ID,"switcher_plogin").click()
driver.find_element(By.CSS_SELECTOR,'[id="u"]').send_keys("13345678900")
time.sleep(3)

# 返回主页
driver.switch_to.default_content()
time.sleep(3)
driver.find_element(By.CSS_SELECTOR,"[class='ui_icon icon_iphone']").click()
time.sleep(3)

多窗口切换:

(点击连接/按钮时,页面会在新窗口打开,但元素不能定位,需要通过窗口的句柄handle实现窗口切换)

  • 实现步骤:

    • 获取所有窗口的句柄:handles=driver.window_handles

    • 切换指定窗口:driver.switch_to.window(handles[n])

  • 示例切换窗口(注意,窗口切换时需要回到初始窗口进行切换)

# 先点击iphone按钮
driver.find_element(By.CSS_SELECTOR,"[class='ui_icon icon_iphone']").click()
time.sleep(5)
# 获取所有窗口的句柄
handles=driver.window_handles
print(handles)

# 跳转到新页面
driver.switch_to.window(handles[0])
time.sleep(5)

基础知识结束!!!!

posted @ 2025-10-17 17:00  Freiheiti  阅读(11)  评论(0)    收藏  举报