今天发现之前的登录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. Editor.md v1.4.2 发布,改进自定义工具栏

    分享 <关于我> 分享  [中文纪录片]互联网时代                 http://pan.baidu.com/s/1qWkJfcS 分享 <HTML开发MacOSAp ...

  2. Qt通过HTTP POST上传文件(python做服务端,附下载)

    本文使用Qt Creator用HTTP POST的方法上传文件,并给出一个上传文件的例程. 本文主要客户端,所以对于服务器端程序编写的描述会比较简略 服务器使用Django编写,django服务器接收 ...

  3. WCF学习--我的第一个WCF例子

    Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口. 通信双方的沟通方式,由合约来订定.通信双方所 ...

  4. Microsoft Development Platform Technologies

  5. hive Metastore contains multiple versions

    凌晨接到hive作业异常,hive版本为1.2.1,hadoop版本apache 2.7.1,元数据存储在mysql中,异常信息如下: Logging initialized using config ...

  6. shell把文件批量导入mysql

    for file in ./tmp_data/* do echo $file mysql -u'root' -p'wangbin' --default-character-set=utf8 -e&qu ...

  7. 使用LinkedList模拟一个堆栈或者队列数据结构。

    堆栈:先进后出 First in last out filo 队列:先进先出 First in last out filo使用LinkedList的方法,addFirst addLast getFir ...

  8. 627.Swap Salary-(LeetCode之Database篇)

    问题描述 给出下面的表,名为salary. id name sex salary 1 A m 2500 2 B f 1500 3 C m 5500 4 D f 500 要求执行一个UPDATE语句,将 ...

  9. 10 关于DOM的操作

    一.JavaScript的组成 JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:文档对象 ...

  10. Python自学day-11

    一.RabbitMQ概述 RabbitMQ是一种消息队列,是一个公共的消息中间件,用于不同进程之间的通讯. 除了RabbitMQ以外,还有ZeroMQ.ActiveMQ等等. 前面学习了两种队列: 线 ...