多窗口处理

点击某些链接,会重新打开一个窗口,对于这种情况。想在薪页面操作,就得先切换窗口了。

获取窗口得唯一标识用句柄表示,所以只需要切换句柄,就可以在多个页面进行操作了

1、 先获取到当前得窗口句柄(drive.current_window_handle)

2、 再获取到所有得窗口句柄(drive.window_handles)

3、 判断是否是想要操作得窗口,如果是,就可以对窗口进行操作,如果不是。就跳转到另外一个窗口,对另一个操作进行操作(drive.switch_to_window)

Demo

操作步骤

1、打开百度,

2、点击登录

3、在弹出框点击注册账号

4、跳到注册账号页,输入用户名和账号

5、返回第一个登录页

6、在登录页输入账号密码,点击登录

  1. import pytest
  2. import time
  3. from selenium import webdriver
  4. from selenium.webdriver.chrome.options import Options
  5. from selenium.webdriver.support.wait import WebDriverWait
  6. from selenium.webdriver.support import expected_conditions
  7. from selenium.webdriver.common.by import By
  8. from selenium.webdriver import ActionChains
  9. from selenium.webdriver.support import expected_conditions as EC
  10. from selenium.webdriver.common.keys import Keys
  11. from selenium.webdriver import TouchActions
  12. class TestActions:
  13. def setup(self):
  14. self.chrome_options = Options()
  15. self.chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") # 指定配置好的 chrom
  16. self.chrome_options.add_experimental_option("w3c", False)
  17. self.chrome_driver = r"./chromedriver.exe" # 驱动路径
  18. self.driver = webdriver.Chrome(self.chrome_driver, chrome_options=self.chrome_options) # 加入驱动设置
  19. # self.driver.get('https://sahitest.com/demo/clicks.htm') # 发起请求
  20. # self.driver.maximize_window() # 设置为最大化
  21. self.driver.implicitly_wait(3) # 添加一个隐式等待默认等待3秒
  22. def teardown(self):
  23. print('关闭浏览器')
  24. # time.sleep(1)
  25. # self.driver.quit()
  26. def test_login(self):
  27. url = 'https://www.baidu.com/'
  28. self.driver.get(url) # 发起请求
  29. self.driver.find_element_by_xpath("//a[@id='s-top-loginbtn']").click() # 点击登录
  30. self.driver.find_element_by_xpath("//a[contains(text(),'立即注册')]").click() # 点击立即注册
  31. print(self.driver.window_handles) # 查看目前有几个页面
  32. window1 = self.driver.current_window_handle # 目前选中得页面
  33. self.driver.switch_to_window(self.driver.window_handles[-1])
  34. window2 = self.driver.current_window_handle # 选择新打开得页面
  35. print(window2, window1)
  36. # 在第二个页面输入账号密码
  37. self.driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_4__userName']").send_keys('1311111')
  38. self.driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_4__phone']").send_keys('1311111')
  39. # 返回第一个页面,然后点击立即登录
  40. self.driver.switch_to_window(window1) # 因为上面步骤已经将window1记录了下来,所以可以直接选择window1
  41. self.driver.find_element_by_xpath("//p[@id='TANGRAM__PSP_11__footerULoginBtn']").click() # 点击登录
  42. self.driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_11__userName']").send_keys("lakes") # 输入账号
  43. self.driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_11__password']").send_keys("lakes") # 输入密码
  44. self.driver.find_element_by_xpath("//input[@id='TANGRAM__PSP_11__submit']").click() # 点击登录
  45. if __name__ == '__main__':
  46. pytest.main(['-vs', "test_action.py::TestActions"])

frame的处理

在web自动化中,如果一个元素定位不到,那么很大可能这个元素在iframe中

Frame分类

标签主要表现为 : frameset、frame、 iframe 三种

frame 存在两种

  • 一种是嵌套的,一种是未嵌套的

切换嵌套的frame

  • driver.switch_to.frame() # 根据元素id或者index 切换成frame
  • driver.switch_to.default_content() # 切换到默认的frame
  • driver.stitch_to.parent_frame() # 切换到父级frame

切换未嵌套的frame

  • driver.switch_to_frame("frame的id")
  • driver.switch_to_frame("frame-index") frame无id的时候要根据索引来处理,索引从0开始 driver.switch_to_frame(0)

用法:

切换到所在的frame, 就可以通过selenium的定位定位到

selenium 多窗口处理与网页frame的更多相关文章

  1. Python3 Selenium多窗口切换

    Python3 Selenium多窗口切换 以腾讯网(http://www.qq.com/)为例,打开腾讯网,点击新闻,打开腾讯新闻,点击新闻中第一个新闻链接. 在WebDriver中封装了获取当前窗 ...

  2. scrapy和selenium结合抓取动态网页

    1.安装python (我用的是2.7版本的) 2.安装scrapy:   详情请参考 http://blog.csdn.net/wukaibo1986/article/details/8167590 ...

  3. Python+Selenium学习--窗口切换及操作元素

    场景 有时候我们在测试一个web 应用时会出现多个浏览器窗口的情况,在selenium1.0 中这个问题比较难处理.webdriver 提供了相关相方法可以很轻松的在多个窗口之间切换并操作不同窗口上的 ...

  4. selenium webdriver窗口切换(上)

    selenium webdriver窗口切换,有时候在做自动化的时候需要打开很多很多的页面, 当在操作不同的页面的时候需要切换窗口,下面是如何切换到前后页面窗口的操作: package test201 ...

  5. python3 + selenium 之窗口切换

    窗口切换 此代码来源学习后对淘宝操作实践记录: 以下代码在Chrome61和IE11上正常运行,Firefox5.7上运行存在一些问题须改进,应该是火狐不兼容差link_text部分和循环经常报错,在 ...

  6. selenium 多窗口(windows)及ITargetLocator使用总结

    1. selenium能实现窗口切换的原理 2. 常见命令 2.1 WindowHandle 2.2 WindowHandles 2.3 SwitchTo 3. 使用JavaScript新建窗口 4. ...

  7. selenium切换窗口

    在做网页自动化测试的时候,难免会打开很多个网页,那么,如何在多个窗口之间切换呢? 获取窗口的唯一标识用句柄(handle)表示,因此只需要切换句柄,就可以灵活的在各窗口之间切换. 下面介绍几个方法 c ...

  8. 爬虫-----selenium模块自动爬取网页资源

    selenium介绍与使用 1 selenium介绍 什么是selenium?selenium是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作.     sel ...

  9. 自动化测试基础篇--Selenium多窗口、句柄问题

    摘自https://www.cnblogs.com/sanzangTst/p/7680402.html 有时我们在打开浏览器浏览网页时,当点击网页上某些链接时,它不是直接在当前页面上跳转,而是重新打开 ...

  10. selenium webdriver窗口切换(下)

    多窗口切换有时候需要在不同的窗口切换,从而操作不同的窗口上的元素.在selenium1.0 中这个问题比较难处理.但WebDriver 提供了switcTo.window()方法可以切换到任意的窗口. ...

随机推荐

  1. loadrunner写webservice接口

    先用soupUI调试  fiddler抓包 然后再写: web_custom_request("createSoapOrder",         "URL=http:/ ...

  2. vs2022和wsl2开发和调试c++代码(转载)

    看见一个不错的帖子(知乎) https://zhuanlan.zhihu.com/p/390757559 里面最主要就是要保证wsl里面安装的东西够了,第二就是vs2022已经安装了linux的相关模 ...

  3. mock数据规则

    Mock数据规则 随机生成100条内的list数据 let Mock = require("mockjs"); let basicData = Mock.mock({ " ...

  4. github fork 别人的项目源作者更新后如何同步更新

    如下 左边选择我们拷贝的库  右边选择原工程 如下 点击箭头指向的位置 然后选择右边原工程目录

  5. ESP32 优化 IRAM 内存方法整理 ---ESP32

    有以下三种方便的方法来优化 IRAM 内存: 启用 menuconfig -> Compiler option -> Optimization Level -> Optimize f ...

  6. Spring-传统方式(XML)创建webapp

    如何搭建一个传统的webapp项目[Java后端] 使用xml 来搭建 SSM 环境,要求 Tomcat 的版本必须在 7 以上 QuickStart 1创建工程 创建一个新模块[普通的 Maven ...

  7. 【QCustomPlot】简介

    说明 使用 QCustomPlot 绘图库辅助开发时整理的学习笔记. 目录 说明 1. 库简介 2. 库的官网链接 3. 库的帮助文档 4. 库的下载地址 5. 库的版本号说明 6. 库的 Git 地 ...

  8. java数据类型转换有哪几种?看这篇就够了!

    前言 在上一篇文章中,壹哥给大家讲解了Java中的数据类型,从此大家就知道了基本类型和引用类型,尤其是8种基本类型的使用和各自特点.但实际上数据类型的使用还有很多更深入的内容,比如java数据类型直接 ...

  9. 自己动手从零写桌面操作系统GrapeOS系列教程——21.汇编语言写硬盘实战

    学习操作系统原理最好的方法是自己写一个简单的操作系统. 在上一讲中我们学习了用汇编语言读硬盘,本讲我们来学习用汇编语言写硬盘.同样也是设计一个简单的实验,实验内容为: 在内存中准备一段有特征的512字 ...

  10. Logoist - 适用于设计师以及初次使用者的快速制作精美 logo 工具

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/24c0f566dcf14be2aa72afaa78c87c40.png)>从简单的标识到设计开发.它只需要一点 ...