首先什么是句柄?句柄就是你点击一个页面,跳转了一个新的窗口。你要操作的元素可能在原窗口上,也有可能在新窗口上。

看下图句柄1

句柄2

由这2张图可知,url不一样,证明他们是处于不同的界面,我要操作的元素是在句柄2上。

处理方式,先用print(self.driver.window_handles)打印出2个界面的句柄,一个打印跳转界面前的,一个打印跳转之后。打印出来如下图,是个列表

然后看你要操作的元素在哪个界面上,比如下标为0的句柄对应的是跳转之前的界面,下标为1的就代表跳转之后的句柄。

用 self.driver.switch_to.window(self.driver.window_handles[1])选择你要跳转的句柄,我这里要操作的界面是跳转之后所以选择的1。跳转之后就可以继续定位元素了。这里的self是类本身,如果不是用面向对象的方式写的可以不加这个。

窗口句柄的第二种解决方式,简单说下,可以用close关闭当前窗口,这里关闭,默认关的是跳转之前的,不是跳转之后的。这样句柄就只剩下一个了。然后在用switch_to选择下标为0的句柄。就可以就行操作了。只适用于要操作的元素是在跳转之后的界面。


上代码:
from selenium import webdriver
import time
import multiprocessing class Zutuan():
def __init__(self):
"""打开浏览器"""
self.driver = webdriver.Chrome() def open_zutuan(self, url):
"""传入组团url"""
self.driver.get(url)
self.driver.maximize_window()
self.driver.refresh()
#time.sleep(0.01)
self.driver.implicitly_wait(30) # todo implicitly隐式等待,等待元素可见 def option_element(self, user, password):
"""手写xpath定位元素"""
self.driver.find_element_by_xpath('//div[@class="login a"]/i').click()
time.sleep(0.01)
self.driver.find_element_by_xpath('//div[@class="a-title"]').click()
self.driver.find_element_by_xpath('//input[@type="text" or @class="userName"]').send_keys(user)
self.driver.find_element_by_xpath('//input[@type="password"]').send_keys(password)
self.driver.find_element_by_xpath('//div[@class="button"]').click()
time.sleep(0.1) def select_commodity(self, content):
"""搜索组团商品"""
# TODO self.content实例属性传给下面的方法使用,如果想把值给下面的方法用,添加实例属性解决
self.content = content
self.driver.find_element_by_xpath('//input[@type="text"]').send_keys(content)
self.driver.find_element_by_xpath('//div[@class="search"]').click()
return content def result(self):
"""判断搜索商品成功后的提示信息,断言页面是否成功"""
if self.content in self.driver.page_source:
#print(self.content)
print('商品搜索成功,测试通过')
else:
print('商品搜索错误,测试失败') def closed(self):
"""关闭浏览器"""
time.sleep(1)
self.driver.quit() def run1():
# TODO 根据操作顺序,调用方法执行
zt = Zutuan()
zt.open_zutuan('http://www.zutuan.cn/index.html#/')
zt.option_element('1489@qq.com', 'mg123456')
zt.select_commodity('木瓜')
zt.result()
zt.closed() class View_details(Zutuan):
"""把商品添加为明星单品,"""
def check_commodity(self, number):
"""进入商品详情页,点击添加明星单品"""
self.driver.find_element_by_xpath('//a[@target="_blank"]/img').click()
self.driver.switch_to.window(self.driver.window_handles[1])
self.driver.find_element_by_xpath('//div[@class="child start"]').click()
self.driver.find_element_by_xpath('//div[@class="el-dialog__body"]//input[@type="text"]').send_keys(number)
self.driver.find_element_by_xpath('//button[@type="button" and @class="el-button el-button--danger"]').click()
time.sleep(0.1) def result(self):
"""重写父类方法,判断商品添加成功后的提示信息,断言页面是否成功"""
if '添加成功' in self.driver.page_source:
print('商品添加成功,测试通过')
else:
print('商品添加失败,测试失败')
# 调用父类方法关闭
super().closed() def run2():
vd = View_details()
vd.open_zutuan('http://www.zutuan.cn/index.html#/')
vd.option_element('14861@qq.com', 'mg123456')
vd.select_commodity('裤子')
vd.check_commodity(9168)
vd.result() def main():
p1 = multiprocessing.Process(target=run1)
p2 = multiprocessing.Process(target=run2) p1.start()
p2.start() if __name__ == '__main__':
main()

关于selenium自动化对窗口句柄的处理的更多相关文章

  1. python+selenium自动化软件测试(第2章):WebDriver API

    2.1 操作元素基本方法 前言前面已经把环境搭建好了,从这篇开始,正式学习selenium的webdriver框架.我们平常说的 selenium自动化,其实它并不是类似于QTP之类的有GUI界面的可 ...

  2. Python+Selenium自动化总结

    Python+Selenium自动化总结 1.环境搭建 1.1.安装selenium模块文件 pip install selenium 1.2.安装ChromeDriver驱动 [1]下载安装Chro ...

  3. selenium获取多窗口句柄并一一切换至原窗口句柄(三个窗口)

    网上有很多是selenium基于python来获取两个窗口句柄与切换,本文实现用python+selenium获取多窗口句柄并一一切换至原窗口句柄(三个窗口),且在每个窗口下进行一个搜索或翻译,然后截 ...

  4. Python2.6.6执行selenium自动化

    系统类型: [root@bogon home]# uname -aLinux bogon 2.6.32-431.el6.x86_64 #1 SMP Sun Nov 10 22:19:54 EST 20 ...

  5. Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析

    加速IE浏览器自动化执行效率:Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析 1.技术背景       在Web应用中,用户通过键盘在输入框中输入值和鼠标点击按钮,链 ...

  6. Selenium2学习-036-WebUI自动化实战实例-034-JavaScript 在 Selenium 自动化中的应用实例之六(获取 JS 执行结果返回值)

    Selenium 获取 JavaScript 返回值非常简单,只需要在 js 脚本中将需要返回的数据 return 就可以,然后通过方法返回 js 的执行结果,方法源码如下所示: /** * Get ...

  7. Selenium2学习-032-WebUI自动化实战实例-030-JavaScript 在 Selenium 自动化中的应用实例之五(高亮标示元素)

    在自动化脚本编写过程中,操作元素之前,需要对元素进行高亮显示(通过修改元素的边框样式),同时进行截图,以记录操作的元素对象.在实际应用中较为少见,通常用于演示,或者发生错误时的屏幕截图捕捉,用于错误报 ...

  8. Selenium2学习-031-WebUI自动化实战实例-029-JavaScript 在 Selenium 自动化中的应用实例之四(获取元素位置和大小)

    通过 JS 或 JQuery 获取到元素后,通过 offsetLeft.offsetTop.offsetWidth.offsetHeight 即可获得元素的位置和大小,非常的简单,直接上源码了,敬请参 ...

  9. Selenium2学习-027-WebUI自动化实战实例-025-JavaScript 在 Selenium 自动化中的应用实例之三(页面滚屏,模拟鼠标拖动滚动条)

    日常的 Web UI 自动化测试过程中,get 或 navigate 到指定的页面后,若想截图的元素或者指定区域范围不在浏览器的显示区域内,则通过截屏则无法获取相应的信息,反而浪费了无畏的图片服务器资 ...

随机推荐

  1. Git常用命令--了解这些就够了

    <div class="show-content-free"> <blockquote> Csdn 将本地工程push到远程 方式一: 建立本地仓库 git ...

  2. 百度OCR 文字识别 Android安全校验

    百度OCR接口使用总结: 之前总结一下关于百度OCR文字识别接口的使用步骤(Android版本 不带包名配置 安全性弱).这边博客主要介绍,百度OCR文字识别接口,官方推荐使用方式,授权文件(安全模式 ...

  3. ThinkPHP 5.0 控制器-》请求-》数据库

    ThinkPHP 5.0 控制器->请求->数据库 控制器总结 无需继承其他的类(若继承了Think/Controller,可直接调用view函数渲染模板),位置处于application ...

  4. 在pom.xml中的dependencies点击add怎么没有搜索到相关jar包

    1.eclipse菜单 window-> show view –> other –> Maven 2.在打开的窗口里,右键 local repositories –> loca ...

  5. AIX7.1安装zabbix_agent3.4

    1.在zabbix官网https://www.zabbix.com/download下载Zabbix pre-compiled agents 2.Zabbix pre-compiled agents安 ...

  6. selenium Java中常见等待的几种形式

    前言 在自动化测试中,我们经常会碰到编写脚本过程中操作某个元素的时候, 需要等待页面加载完成后,才能对元素操作,否则会报错,提示页面元素不存在异常,我们需要等待元素加载完成后,才能继续操作,而Sele ...

  7. burpsuit用法

    1. 学习Proxy首先看标红,intercept is on 为拦截状态  其对应的intercept is off 为非拦截状态,设置完代理后打开拦截状态 ,浏览器发起的请求会被burpsuite ...

  8. 负载分配—DNS的域名解析

    DNS(Domain Name System)是因特网的一项服务,它作为域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网.人们在通过浏览器访问网站时只需要记住网站的域名即可,而不需 ...

  9. 基于drone构建CI-CD系统

    kubernetes集群三步安装 CI 概述 用一个可描述的配置定义整个工作流 程序员是很懒的动物,所以想各种办法解决重复劳动的问题,如果你的工作流中还在重复一些事,那么可能就得想想如何优化了 持续集 ...

  10. html5教程 《实用技巧》—让你的网站变成响应式的3个简单步骤

    如今,一个网站只在桌面屏幕上好看是远远不够的,同时也要在平板电脑和智能手机中能够良好呈现.响应式的网站是指它能够适应客户端的屏幕尺寸,自动响应客户端尺寸变化.在这篇文章中,我将向您展示如何通过3个简单 ...