在实际定位元素的过程中,发现有一种情况让人很是恼火,根据xpath路径定位,感觉像是没错哦,但是执行时就来一个报错信息……为什么呢?

多表单切换

例如我们登录网易邮箱时就会发现,定位登录框时,一个嵌套的页面让定位变得如同相隔千山万水……

此时就需要切换表单来解救了:

惯例惯例~

# coding=utf-8

from selenium import webdriver

dr = webdriver.Chrome()

dr.get("https://mail.163.com/")

dr.switch_to_frame("x-URS-iframe")
dr.find_element_by_name("email").clear()
dr.find_element_by_name("email").send_keys("username")
dr.find_element_by_name("password").clear()
dr.find_element_by_name("password").send_keys("password")
dr.find_element_by_id("dologin").click()
dr.switch_to_default_content() dr.quit()

通过switch_to_frame切换到登录表单中,之后就可以按照之前定位元素的方法定位元素并输入信息了。

当然如果想切换回源页面,可以直接使用 switch_to_default_content() 返回默认的最外层页面中。

多窗口切换

还有的情况就需要仔细甄别了,是不是通过链接打开了一个新的窗口…

来来来,最近时事比较热的新闻来看一看~  

# coding=utf-8

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC dr = webdriver.Chrome() dr.get("https://www.baidu.com")
dr.find_element_by_name("tj_trnews").click()
window_0 = dr.current_window_handle try:
element = WebDriverWait(dr, 10).until(EC.element_to_be_clickable(
(By.XPATH, '//*[@id="pane-news"]/div/ul/li[1]/strong/a')))
element.click()
window_1 = dr.current_window_handle
windows = dr.window_handles
print(window_0, window_1, "\n", windows) dr.switch_to_window(windows[-1]) window_1 = dr.current_window_handle
print(window_0, window_1, "\n", windows) time.sleep(5) finally:
dr.quit()

通过上述代码执行,可以看出,我为了打开百度新闻的热点新闻中的头条真的真的做出了一系列努力

代码中结合之前学习的显示等待,因为在测试过程执行的过程中发生了百度新闻的页面未完成加载未能找到热点新闻对应的元素的情况,自然也就无法定位给出了报错信息,心想继续使用time.sleep(5)着实是有点low,用上之前学习的显式等待吧。

在执行过程中,模拟鼠标点击热点新闻的第一行之后看到打开了一个新的标签页,但是我们通过 current_window_handle 查看当前窗口的句柄时,发现虽然打开了新的标签页,但是焦点并未聚焦于新的标签页,仍旧停留在原始页面,如果需要在新的页面中执行操作,怎么办?

通过 windows = dr.window_handles 获取所有窗口页面的句柄,再通过 dr.switch_to_window(windows[-1]) 切换到最新的窗口页面,此时再来查看当前的窗口句柄,就发现,已然切换成功了,有成就感~

Python3+Selenium3自动化测试-(七)的更多相关文章

  1. Python3+Selenium3自动化测试-(二)

    python3 元素定位和操作方法总结 # coding=utf-8 ''' #8种元素定位方法 find_element_by_id() find_element_by_name() find_el ...

  2. Python3+Selenium3自动化测试-(五)

    这里来说一说selenium中的等待方式,其实在webdriver只有两种类型等待方式,显式等待和隐式等待,之前是在程序运行过程中使用time模块中的sleep进行代码的休眠进行强制等待,是显式等待中 ...

  3. Python3+Selenium3自动化测试-(四)

    selenium鼠标事件 # coding=utf-8 import time from selenium import webdriver from selenium.webdriver.commo ...

  4. Python3+Selenium3自动化测试-(三)

    selenium键盘事件 #coding=utf-8 from selenium import webdriver import time from selenium.webdriver.common ...

  5. Python3+Selenium3自动化测试-(一)

    完成环境的安装并测试之后,我们对Selenium有了一定的了解了,接下来我们继续驱动浏览器做一些基本操作: 窗口尺寸设置.网页截图.刷新.前进和后退 窗口尺寸设置 在测试过程中,我们可能会要求打开浏览 ...

  6. Selenium3自动化测试【27】Frame的操作

    本篇文章内容摘要 " 讲解Python3+Selenium3如何处理Frame窗体" 同步视频知识与系列知识内容,可关注:[公众号]:柒哥测试:[WX]:Lee-890;[视频号] ...

  7. Python3+unitest自动化测试初探(中篇)

    目录 6.生成测试报告 7.编写邮件发送工具 8.发送邮件 发布 0 86 编辑 删除 Python3+unitest自动化测试初探(中篇)(2019-04-18 01:41) 发布 3 245 编辑 ...

  8. Python3+unitest自动化测试初探(下篇)

    目录 9.用例结果校验 10.跳过用例 11.Test Discovery 12.加载用例 unittest官方文档 本篇随笔承接: Python3+unitest自动化测试初探(中篇) Python ...

  9. 从零开始学习PYTHON3讲义(七)条件分支和哥德巴赫猜想

    <从零开始PYTHON3>第七讲 人生是由无数个选择组成,每个选择都有不同的限定条件.现在来说人生有点早是吧:)不过事实的确是这样的. 程序也充满着选择,满足不同的条件,则运行不同的运算. ...

  10. Python3 Selenium自动化测试赋值出现:WebDriverException: Message: unknown error: call function result missing 'value'

    Python3 Selenium自动化测试赋值出现:WebDriverException: Message: unknown error: call function result missing ' ...

随机推荐

  1. 5.pygame快速入门-精灵和精灵组

    在之前案例中,图像加载.位置变化.绘制图像都需要编写代码分别处理 pygame提供了两个类简化开发步骤 pygame.sprite.Sprite #精灵,存储图像数据image和位置rect的对象 p ...

  2. Debian11管理员手册

    1 用户与群组数据库 用户清单通常保存在 /etc/passwd 文件内,把哈希编码后的密码保存在 /etc/shadow 文件内.这两个文件都是纯文本档,以简单的格式保存,可以用文本编辑器读取与修改 ...

  3. Windows下pip换成清华源

    1.在C:\Users\用户名\ 下创建 pip 文件夹2.在文件夹内创建pip.ini 文件, 添加如下内容: [global] timeout = 6000 index-url = https:/ ...

  4. spring-ioc知识点

    1.bean管理 -spring创建对象 -在spring的配置文件中,使用bean标签.标签里添加对应的属性.就可以实现对象的创建 -在bean标签中有很多属性 -id属性:唯一的标识 -class ...

  5. P6492 STEP(线段树维护左右区间pushup)

    题目链接 题目描述: 给定一个长度为\(~\)n\(~\)的字符序列\(~\)a,初始时序列中全部都是字符\(~\)L. 有\(~\)q\(~\)次修改,每次给定一个\(~\)x,做出如下变化: \( ...

  6. redis的缓存穿透、击穿、雪崩以及实用解决方案

    今天来聊聊redis的缓存穿透.击穿.雪崩以及解决方案,其中解决方案包括类似于布隆过滤器这种网上一搜一大片但是实际生产部署有一定复杂度的,也有基于spring注解通过一行代码就能解决的,其中各有优劣, ...

  7. networkQuality

    基本使用 networkQuality 是一个命令行工具,需要使用「终端」App(或者你首选的其他终端模拟器)运行.方法是: 首先,点按「程序坞」(Dock)中的「启动台」(LaunchPad)图标, ...

  8. KubeEdge的云边协同设计原理

    1.云端组件与K8s Master的关系 cloudCore和K8s master,非侵入的映射 2.EdgeController详解 -边缘节点管理 -应用状态元数据云边协同 3.DeviceCon ...

  9. Centos7.6分区、格式化、自动挂载磁盘

    个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github‍:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying 目录 1. 添加硬盘 2. 执行fdisk -l ...

  10. 重学c#系列——枚举[二十三]

    前言 该系列继续更新,枚举介绍. 正文 首先呢,枚举是值类型,这个没什么好说的. enum ConnectionState { DisConnected, Connecting, Connected, ...