今天发现之前的登录163邮箱脚本定位不到iframe了,原因是iframe拼接了动态ID,修改后的脚本如下:

from selenium import webdriver

driver = webdriver.Firefox()
driver.maximize_window() driver.get('http://mail.163.com') driver.find_element_by_id('switchAccountLogin').click()
iframe = driver.find_element_by_xpath('//*[@id="loginDiv"]/iframe') # 使用Xpath选定位到iframe
driver.switch_to.frame(iframe)          # 切换iframe
# iframe = driver.find_element_by_xpath("//iframe[contains(@id, 'x-URS-iframe')]")  # 使用Xpath提供的contains定位
# driver.switch_to.frame(iframe)
driver.find_element_by_name('email').send_keys('name')
driver.find_element_by_name('password').send_keys('password')
driver.find_element_by_id('dologin').click()

总结一下常见iframe定位方法。

一、非动态的iframe,通常通过以下方式定位:

1.有id,如果唯一,可直接写id

  driver.switch_to.frame("id")

2.有name,如果唯一,可直接写name

  driver.switch_to.frame("name")

3.无id,无name,可先定位到iframe元素 (该方法也通常用于定位动态ID)

  iframe = driver.find_elements_by_tag_name("iframe")[0]  (也可以通过Xpath、CSS等定位方法)

  driver.switch_to.frame(iframe)

二、遇到动态Id可以利用xpath等元素属性来定位,下面列举xpath中提供的三个非常好的方法:

1.contains(a, b) 如果a中含有字符串b,则返回true,否则返回false

  driver.find_element_by_xpath("//div[contains(@id, 'btn-attention')]")

2.starts-with(a, b) 如果a是以字符串b开头,返回true,否则返回false

  driver.find_element_by_xpath("//div[starts-with(@id, 'btn-attention')]")

3.ends-with(a, b) 如果a是以字符串b结尾,返回true,否则返回false

  driver.find_element_by_xpath("//div[ends-with(@id, 'btn-attention')]")

python+selenium实现163邮箱登陆—iframe动态ID定位 及常用定位方法的更多相关文章

  1. Python selenium登录163邮箱示例

    思路:使用python自带的unittest单元测试框架测试163邮箱登录成功的case import unittestfrom selenium import webdriverimport tim ...

  2. Selenium定位iframe动态ID

    Selenium定位iframe动态ID. 126邮箱实例 买了本虫师的书来学习selenium2自动化测试,然后写第一个实例就遇到了一些坑,好在有热心的网友提供了帮助,解决了问题 要学习seleni ...

  3. 5、Selenium+Python自动登录163邮箱发送邮件

    1.Selenium实现自动化,需要定位元素,以下查看163邮箱的登录元素 (1)登录(定位到登录框,登录框是一个iframe,如果没有定位到iframe,是无法定位到账号框与密码框) 定位到邮箱框( ...

  4. python登录网易163邮箱,爬取邮件

    from common import MyRequests,LoggerUntil,handle_exception myRequests.update_headers({ 'Accept':'tex ...

  5. selenium登录163邮箱,得到cookie,requests后续请求

    1.场景 很多时候登录操作是比较复杂的,因为存在各种反爆破操作,以及为了安全性提交数据都会存在加密.如果要完全模拟代码去实现登录操作是比较复杂,并且该网站后续更新了登录安全相关功能,那么登录的模拟操作 ...

  6. python练习-使用163邮箱发送邮件

    具体代码如下> #密码等敏感信息已经用****替换 import smtplib,sys from email.mime.text import MIMEText from email.head ...

  7. python学习笔记:(七)dict(字典)常用的方法

    字典是通过名称来引用值的数据结构,这种类型的数据结构称为:映射. 字典是python中唯一的内建映射类型. 注意: 1.字典中键必须是唯一的,如果同一个键被赋值两次,会使用后一个值: 2.键必须不可变 ...

  8. python webdriver 登录163邮箱发邮件加附件, 外加数据和程序分离,配置文件的方式

    配置文件:UiObjectMapSendMap.ini用来存放配置信息 GetOptionSendMail.py 用来读取配信息 #encoding=utf-8from selenium.webdri ...

  9. CSS练习一(模仿163邮箱登陆)

    // '); code = code.replace(/&/g, '&'); return code; }; var runCode = function (code) { if (c ...

随机推荐

  1. CopyFile函數詳解

    CopyFile函數,文件拷贝函数.其基本結構如下: copyfile( lpcstr lpexistingfilename, // 源文件路径 lpcstr lpnewfilename, //新文件 ...

  2. WCSTOMBS 函数不支持中文件的解决方法(设置代码页)

    代码页没有进行设置.需要调用locale.h 中定义的一个函数设置默认的代码页 _tsetlocale(LC_ALL,_T(""));//设置代码页  wcstombs(sendB ...

  3. 网络软件,BA File,Disk,Photo,BackupTools等等(Mac版)

    Auto FTP Manager 6.01Crossworld CrossFTP Enterprise v1.97.7 http://www.airexplorer.net/en/index.phpC ...

  4. Qt在Windows下如何创建无CMD窗口控制台程序

    默认情况下,用Qt新建一个控制台程序,运行时会弹出CMD窗口.如何把窗口去掉呢? *.pro文件默认是这样的: TEMPLATE = app CONFIG += console CONFIG -= a ...

  5. 用Golang让自己的电脑自动登录“上网管理”系统

    用Golang让自己的电脑自动登录 1.缘起 大天朝的网络一般都是只对某些人开放的.上行下效,同样的措施也作用在我们的教育网上.我想不出来,为什么很多领导的总有这样的恶趣味(如果做的到,他们恨不得监控 ...

  6. linux下安装Nginx1.16.0

    因为最近在倒腾linux,想安装新版本的nginx,找了一圈教程没有找到对应的教程,在稍微倒腾了一会之后终于成功的安装了最新版. 服务器环境为centos,接下来是详细步骤: 安装必要依赖插件 yum ...

  7. Laravel --- 【转】安装调试利器 Laravel Debugbar

    [转]http://www.tuicool.com/articles/qYfmmur 1.简介 Laravel Debugbar 在 Laravel 5 中集成了 PHP Debug Bar ,用于显 ...

  8. Spring事务原理一探

    概括来讲,事务是一个由有限操作集合组成的逻辑单元.事务操作包含两个目的,数据 一致以及操作隔离.数据一致是指事务提交时保证事务内的所有操作都成功完成,并且 更改永久生效:事务回滚时,保证能够恢复到事务 ...

  9. Docker搭建MySQL主从集群,基于GTID

    写在前边 搭建MySQL读写分离主从集群,这里未使用binlog方式,使用的是GTID方式 源码见我的Github https://github.com/hellxz/mysql-cluster-do ...

  10. Codeforces Gym101505G:Orchard Division(扫描线+线段树第k大)

    题目链接 题意 给出一个m*m的地图,上面有n个点,现在需要用一个自定义面积的矩形笼罩住恰好n/2个点,并且这个矩形需要有一个点在至少一个角落上,问这个矩形最小的面积是多少. 思路 有点类似于扫描线. ...