Selenium弹出新页面无法定位元素问题(Unable to locate element)--多窗口切换

最近学习到多窗口切换,在页面操作过程中有时点击某个链接会弹出新的窗口,这时需要先切换到新窗口才能对其进行操作。Webdriver提供了switch_to.window( ) 方法实现在不同窗口中切换。

查阅相关资料,得到两种方法来定位到当前页面:

方法一:

browser.switch_to_window(browser.window_handles[1])

方法二:直接定位当前最新弹出的窗口

for handle in browser.window_handles:#方法二,始终获得当前最后的窗口,所以多要多次使用
    browser.switch_to_window(handle)

方法一 VS 方法二

相比较于方法二,方法一的优点在于后续操作,比如关闭第几个窗口,句柄传递是按照顺序来的。缺点在于对于较多新页面,有时候弹出窗口太多会变得难以计算。

而方法二,一直在获取最后的窗口,如果你只是对最后的窗口进行操作,也就是(自己定义的)”前向“操作时,不计后果,可以直接拿来用,而且代码不变。缺点在于,如果要返回到某个窗口句柄,那就显得没有方法一来的好。相对推荐使用方法一。

贴代码

可以参照 http://blog.csdn.net/mrlevo520/article/details/51926145/ 获得更多的解析。

#Author:哈士奇说喵
#因为搜索引擎检索项根据热度来排名,所以我只能对7.17的数据进行测试和负责,大家测试时候注意元素变化
#coding=utf-8
from selenium import webdriver
import time

browser=webdriver.Firefox()
browser.get("http://cn.bing.com/")
browser.find_element_by_name (‘q‘).send_keys("MrLevo520 CSDN")
time.sleep(1)
#----------操作一:进行对关键字MrLevo520 CSDN搜索----------
browser.find_element_by_id("sb_form_go").click()#执行此操作会进行搜索,但是没有弹出新窗口,所以句柄不用重定位
time.sleep(3)
#----------操作二:对搜索页面第一项进行点击操作--------------
browser.find_element_by_xpath(".//*[@id=‘b_results‘]/li[1]/div[1]/h2/a").click()#进行当前页面点击第一项
time.sleep(3) #一定要加,会报错
#----------操作三:对新弹出的页面再点击"我的头像"选项---------
#注意此时已经是弹出的第一个窗口了,需要重新定位句柄
‘‘‘browser.switch_to_window(browser.window_handles[1])#方法一‘‘‘
for handle in browser.window_handles:#方法二,始终获得当前最后的窗口
    browser.switch_to_window(handle)
browser.find_element_by_xpath(".//*[@id=‘blog_userface‘]/a/img").click()

#----------操作四:点击"贡献的资源"------------------------
#注意此时已经是新弹出的第二个窗口了,需要重新定位句柄
browser.switch_to_window(browser.window_handles[2])#方法一,注意window_handles[2]变成了2
‘‘‘for handle in browser.window_handles:#方法二,始终获得当前最后的窗口
    browser.switch_to_window(handle)‘‘‘
browser.find_element_by_link_text ("贡献的资源").click()
time.sleep(3)browser.quit( )
 
时间: 2024-10-11 12:57:07

Selenium弹出新页面无法定位元素问题(Unable to locate element)--多窗口切换的相关文章

解决网页元素无法定位(NoSuchElementException: Unable to locate element)的几种方法

只解决一个问题--NoSuchElementException: Message: Unable to locate element 出错原因 1.可能元素加载未完成 元素加载没完成,同样的路径定位,每次测试结果确是不一样的,有时候抛出错误,有时候正常!这就比较蛋疼了,也就是说,和你的定位方法半毛钱关系没有,而很大程度上取决于你的电脑和网速! 1.解决方案A:添加两行代码 wait = ui.WebDriverWait(driver,10) wait.until(lambda driver: d

Siebel 找字段、下拉菜单设置值、弹出新页面、弹出选择框、设置默认值 、按钮代码

产品缺陷太多,跟用户交互不人性化.例如搜索新建客户功能,用户输入后会自动保存数据,一旦保存后一. 找字段1.简单 CTRL+Q CTRL+Q 服务请求编号----对应的表.字段.长度: 客户编码-----对应的表.字段.长度(弹出新页面):- 点击上面的pick Applet会弹出“选取客户”对话框 有JOIN就不用TABLE:require代表必填 字段有两个值----项目编号 下图确定只有projectNum有用 3.表单中的字段(不在list column中,而是在control) 二.下

javascript 关于弹出新页面始终在正中央方法

记录一个关于弹出新页面始终在正中央方法 function openwindow(url, name, iWidth, iHeight) { var url;                                //转向网页的地址; var name;                          //网页名称,可为空; var iWidth;                         //弹出窗口的宽度; var iHeight;                       

在页面中定位元素

 使用getBoundingClientRect获取元素的边界矩形的大小和位置,然后访问其top和left值以确定位置: //在页面中定位元素 function positionObject(obj) { var rect=obj.getBoundingClientRect(); return [rect.left;rect.top]; } 元素定位是根据该元素的左上角相对于其视口和祖先元素的位置或偏移量来确定的.元素的位置是相对于其他的元素的,并且,还取决于其位置是静态的.相对的.固定的还是绝

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element 定位frame中的元素

from selenium import webdriver import time def sleep(w=1): time.sleep(w) return 0 # 初始化浏览器信息 driver = webdriver.Chrome() driver.get("http://m.mail.10086.cn") print("------------------------------login in-------------------------------"

selenium webdriver(2)—页面对象定位

webdriver的元素定位很灵活,提供了多种定位方式: Id LinkText PartialLinkText Name TagName Xpath ClassName CssSelector 这些方法可以在org.openqa.selenium.By中找到,下面一一道来: 假如有这样的需求:登录安居客网站,搜索陆家嘴附近的二手房源,网页是这样的 这个需求涉及到一个输入框和一个提交按钮,先查看网页源码 在输入框中输入"陆家嘴"然后点击"二手房"按钮,如果能跳转到陆

Selenium定位不到指定元素原因之iframe(unable to locate element)

浏览过程中,图片中的内容可能太小,无法看清,可以>右键>在新标签中打开 Outline 项目原因,需要用selenium实现模拟登陆.模拟上传文件,自然就需要模拟点击[上传]按钮: 模拟点击之前需要通过selenium提供的“方法”去定位到要点击的元素: 模拟登陆过程中,全程都可以定位到需要点击的元素,但登陆后需要定位点击[上传]按钮时问题来了: 元素明明在那放着,就是定位不到,这个问题困扰了一下午还没解决,最终走到了iframe这个一步,才得以解决. 什么是iframe 解决问题之前很有必要

selenium学习:不同方式定位元素

文件名:checkbox.html <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <title>Checkbox</title> <link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css&

js 弹出新页面,避免被浏览器、ad拦截的一种办法

以绑定click弹窗的方式,改为普通的链接,即 a[target=_blank],在点击打开新窗口之前,修改其href. 绑定mousedown,鼠标点击执行完成前修改href. 绑定focus,保证tab切换+enter时替换href. <input type="search" id="keyword" value="" autocomplete="off" placeholder="请输入搜索关键字&quo