Selenium定位iframe动态ID
126邮箱实例
买了本虫师的书来学习selenium2自动化测试,然后写第一个实例就遇到了一些坑,好在有热心的网友提供了帮助,解决了问题
要学习selenium总要先搭建好python环境,这个就不说了 ,网上一搜一大把,也要装好selenium包,毕竟要用到里面的webdriver,它支持firefox,IE,Opera,和Chrome,
so我就装了火狐和谷歌的驱动,把驱动放在python文件夹里面就行了
之后按照上面的例子写了一个脚本
坑的是,我定位不到元素
因为id是动态获取的,并且镶嵌在iframe表单中,好了,只能去定位iframe表单了,
iframe表单也是动态获取的。。然后在测试的朋友发了我一个链接,嗯 找到解决办法了
然后完美解决了,一下是方法:
非动态的iframe可以通过以下方式定位
有id,并且唯一,直接写id
driver.switch_to_frame("x-URS-iframe")
driver.switch_to.frame("x-URS-iframe")(较新版本推荐使用方法)
有name,并且唯一,直接写name
driver.switch_to_frame("xxxx")
driver.switch_to.frame("xxxx") (较新版本推荐使用方法)
无id,无name,先定位iframe元素
iframe = driver.find_elements_by_tag_name("iframe")[0]
driver.switch_to_frame(iframe)
driver.switch_to.frame(iframe) (较新版本推荐使用方法)
如果是动态Id需要借助xpath部分元素属性定位,xpath中提供了三个非常好的方法来为我们定位部分属性值:
driver.find_element_by_xpath
("//div[contains(@id, 'btn-attention')]")
driver.find_element_by_xpath
("//div[starts-with(@id, 'btn-attention')]")
driver.find_element_by_xpath
("//div[ends-with(@id, 'btn-attention')]")
# 这个需要结尾是‘btn-attention’
contains(a, b) 如果a中含有字符串b,则返回true,否则返回false
starts-with(a, b) 如果a是以字符串b开头,返回true,否则返回false
ends-with(a, b) 如果a是以字符串b结尾,返回true,否则返回false
代码如下:
#引入模块
from selenium import webdriver
#引入时间模块
import time
#实例化驱动对象
driver = webdriver.Firefox()(把驱动放到python的script可以正常调用使用这种写法)
driver = webdriver.Firefox(executable_path=r'F:\Python\Scripts\geckodriver.exe')(找不到驱动可以通过写路径的方式来调用)
#打开126邮箱
driver.get("https://mail.126.com/")
#浏览器最大化
driver.maximize_window()
#休眠3秒,方式刷新不出来。
time.sleep(3)
#根据xpath定位ifram表单
driver.switch_to.frame(driver.find_element_by_xpath("//iframe[starts-with(@id, 'x-URS-iframe')]"))
#定位输入账号
driver.find_element_by_name("email").send_keys("xxxxxxxx")
#定位输入密码
driver.find_element_by_name("password").send_keys("xxxxxxxx")
Selenium定位iframe动态ID的更多相关文章
- python+selenium实现163邮箱登陆—iframe动态ID定位 及常用定位方法
今天发现之前的登录163邮箱脚本定位不到iframe了,原因是iframe拼接了动态ID,修改后的脚本如下: from selenium import webdriver driver = webdr ...
- selenium元素定位之 动态id, class元素定位
1.直接进入正题 如下图, 有些元素每次进入都会刷新, 造成元素无法重复定位 怎么办? "xpath部分属性值"定位方法可以帮到我们 1.包含属性定位 driver.find_el ...
- selenium中定位iframe框
这是使用谷歌看到的源码.想要往里面输入内容,需要使用js. 这个iframe没有id,不能通过id直接定位到.但可以通用TagName来定位到iframe. WebDriver中定位的代码如下: St ...
- python selenium ——— 动态id、class定位
什么样的是动态id呢? 动态id就是第一次点击显示的id与二次点击显示的不一样,一般是元素属性中包含一段数字的这种情况. 类似这种: 1 <input type="button&quo ...
- 【转载】webdriver 自动化测试如何定位到动态变化ID的iframe框内
大家知道,在自动化测试脚本编写过程中,如果页面上跳出一个iframe框时,我们是定位不到框内内容的,可以通过 driver.findElement(By.id("")); driv ...
- Selenium如何定位动态id/class的元素?
今天再给大家分享一个定位不到元素的原因——动态id. 没有打开新页面.没有alert.没有frame.加了等待时间,但是还是定位不到元素?很有可能是你要定位的元素的属性是动态的,即每次打开页面,这个 ...
- Java中通过Selenium WebDriver定位iframe中的元素
转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 问题:有一些元素,无论是通过id或是xpath等等,怎么都定位不到. 分析:这很可能是因为你要定位 ...
- Selenium定位不到指定元素原因之iframe(unable to locate element)
浏览过程中,图片中的内容可能太小,无法看清,可以>右键>在新标签中打开 Outline 项目原因,需要用selenium实现模拟登陆.模拟上传文件,自然就需要模拟点击[上传]按钮: 模拟点 ...
- Selenium webdriver定位iframe里面元素两种方法
以东方财富网登录页面为例: 在查找元素过程中,直接通过id或者xpath等找不到元素,查看页面源代码发现元素是属于iframe里,例如: <div class="wrap_login& ...
随机推荐
- install virtual enviroment on windows
H:\>pip install virtualenv --install virtualenvCollecting virtualenv Downloading https://files.p ...
- springBoot、SpringCloud 常用注解
1,@SpringBootApplication是springboot启动类的入口注解,标注在主启动类上:2,@EnableEurekaServer 是eureka服务端启动,接受其他服务注册进来,标 ...
- CSS 背景图像 重复图像
重复图像 background-repeat 属性可以重复图像,这对于小图片来说是福音. background-repeat 属性有6个值: repeat 背景图像在垂直方向和水平方向都重复 repe ...
- jQuery取得radio的值 取select得值
获取一组单选按钮对象: var obj_payPlatform = $('#wrap input[name="payMethod"]'); 获取被选中按钮的值 : var val_ ...
- 19-02【mac电脑操作】最小化应用程序
最小化应用程序 windows下很简单,直接使用windows+M即可: mac电脑下,官方建议是:option+command+m+h.但实际使用的时候,这个快捷键并不好使: 解决方案:mac系统设 ...
- python-django(环境配置)
1.配置虚拟环境 <1>.pip install virtualenv 安装创建虚拟环境的工具 <2>.pip install virtualenvwrappe ...
- jsp请求java返回pdf、excel与word
1,返回pdf关键代码 /** * @todo * @param * @date 2019年3月8日 * @author yanan */ @RequestMapping("/getPdf& ...
- jna调用c++的dll
import java.util.ArrayList; import java.util.List; import com.sun.jna.Structure; public class MyStru ...
- AOP-事物管理
1. Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务
- Flask 验证码 点击验证码刷新
---恢复内容开始--- import random import string # Image:一个画布 # ImageDraw:一个画笔 # ImageFont:画笔的字体 # pip insta ...