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

看下图句柄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. 洛谷P2319 [HNOI2006]超级英雄 题解

    题目链接: https://www.luogu.org/problemnew/show/P2319 分析 每错,这是一道海南不对是河南呀呀呀错了是湖南的省选题. 但是还是可以作为二分图第二题来练手的, ...

  2. Python学习2——Python单行注释、整段注释使用方法

    Python中的注释有多种,有单行注释,多行注释,批量注释,中文注释也是常用的. python注释也有自己的规范,在文章中会介绍到. 注释可以起到一个备注的作用,团队合作的时候,个人编写的代码经常会被 ...

  3. Android/AndroidStudio/idea使用教程之git使用(详细)(码云)

    已经安装好了AndroidStudio,安装教程 本教程是作者自己摸索出来的,有不足之处还请大家海涵.多多拍砖,互相学习. 第一步:下载git,安装git客户端 直接百度git,下载git ​ 安装g ...

  4. 查询表格——建立动态表格,使用ajax输入查询条件将后台数据查询出来以表格的形式展示出来

    建立动态表格,使用ajax将前台查询条件传给后台,并将查询结果以表格的形式展示出来. 页面的展示效果如下图所示: 第一步:查询条件的部分: 代码如下: <div class="text ...

  5. Makefile简单的配置

    一.文件配置目录 1)原目录 demo ├── Makefile ├── demo.cpp ├── demo.hpp └── main.cpp 2)make之后的目录 demo ├── Makefil ...

  6. 完美解决eclipse编辑器中文字符过小问题

    window – preferences – general – appearance – colors and fonts – basic – text font – edit 把弹出页面中“西欧语 ...

  7. Codeforces Round #554 (Div. 2) C. Neko does Maths (数论 GCD(a,b) = GCD(a,b-a))

    传送门 •题意 给出两个正整数 a,b: 求解 k ,使得 LCM(a+k,b+k) 最小,如果有多个 k 使得 LCM() 最小,输出最小的k: •思路 时隔很久,又重新做这个题 温故果然可以知新❤ ...

  8. Integrating Thymeleaf with Spring

    这个是基于注解的配置方式,基于配置文件的http://www.cnblogs.com/honger/p/6875148.html 一.整体结构图 二.web.xml文件,这里使用了注解的方式 < ...

  9. MD、SHA、MAC消息摘要算法实现与应用

    1.消息摘要概述 消息摘要(Message Digest)又称为数字摘要(Digital Digest).它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生 ...

  10. MyBatis在Spring环境下的事务管理

    MyBatis的设计思想很简单,可以看做是对JDBC的一次封装,并提供强大的动态SQL映射功能.但是由于它本身也有一些缓存.事务管理等功能,所以实际使用中还是会碰到一些问题--另外,最近接触了JFin ...