在实际定位元素的过程中,发现有一种情况让人很是恼火,根据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]) 切换到最新的窗口页面,此时再来查看当前的窗口句柄,就发现,已然切换成功了,有成就感~

最新文章

  1. 理解node模块的exports和module.exports
  2. 第2章 面向对象的设计原则(SOLID):1_单一职责原则(SRP)
  3. cf50A(水题)
  4. Java基础之创建窗口——使用GridBagLayout管理器(TryGridBagLayout)
  5. Sqrt(x)
  6. ItemsControl 使用Grid布局
  7. (转)innodb 与 myisam 读写性能分析
  8. 使用struts2标签<s:action无法显示引用页面问题
  9. vs2010 “发生生成错误,运行上次的成功运行的程序”怎么改回不运行。
  10. C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针
  11. Hessian Servlet和Hessian Spring的简单应用
  12. HDU1171-Big Event in HDU
  13. SQL查询获得指定格式内容
  14. 【转载】 C#往文件中追加文本内容信息
  15. Redis之父表示ARM服务器没戏!
  16. android Application Component研究之Activity(二)
  17. [No000016D]把知识种进脑子:像读教材一样读书
  18. 【转】Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)
  19. 5-java 排序, sort, collections.sort()
  20. Oracle —— 如何执行SQL文件

热门文章

  1. Codeforces Round #829 (Div. 2) A-E
  2. Spring Retry 重试
  3. 虚拟机里网络连接的几种方式说明(桥接,NAT, 仅主机)
  4. 3.JS
  5. 操作系统课程设计pintos project1实验摘记
  6. Go语言核心36讲30
  7. Codeforces Round #834 (Div. 3) A-G
  8. 4.5:HDFS操作实验
  9. 【Scala】常见题目中Scala的使用
  10. java中使用apache poi 读取 doc,docx,ppt,pptx,xls,xlsx,txt,csv格式的文件示例代码