selenium模拟登录163邮箱,定位账号及密码输入框问题和iframe嵌套

在学习Python自动化的过程中,这次在163邮箱登录的时候遇到了元素定位问题,通过资料查找,最终解决,现在记录一下。

问题:账号密码输入框定位失败。

发现问题过程:

按照常规的方法进行元素定位,但是发现试了几种办法后,都无法进行解决,都是提示“NoSuchElementException: Message: no such element”元素无法定位或元素不存在的问题。

from selenium import webdriver
import time

driver=webdriver.Chrome()

# 访问163邮箱
mail_url="http://www.mail.163.com"
print("access mail with %s"%mail_url)
driver.get(mail_url)
# time.sleep(10)
# 定位账号输入框
driver.find_element_by_xpath('//input[@name="email"]').clear()  #删除提示信息
driver.find_element_by_xpath('//input[@name="email"]').send_keys("rongxbo")

运行后提示信息如下:

问题解决过程: 

期初以为是元素定位写法有问题,就经过各种修改尝试,发现还是解决不了。最后通过度娘各种查询资料,发现问题所在。产生这个问题跟元素定位没有关系,只是因为这个页面有iframe嵌套页面,需要先切换,再进行元素定位操作才可以。所以,第一步,要先把iframe找出来,然后switch过去试一下。

在进行操作之前,咱们先简单了解一下iframe和switch用法。

什么是iframe?

iframe知识来源于百度百科。

iframe_百度百科IFRAME是HTML标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架(即行内框架)。https://baike.baidu.com/item/iframe/4446518?fr=aladdin即在一个页面框架里面嵌套其他的框架。所以如果有iframe的时候,要定位元素需要先切换到元素所对应的框架。

switch_to用法介绍:

基于python3的语法,driver.switch_to_alert()的表达会出现中划线,因此需要把后面的下划线改为点.

目前接触到的switch_to的用法包括以下几种:

driver.switch_to.window(window_name)       切换到指定的window_name页面

driver.switch_to.alert()                                    切换到alert弹窗

driver.switch_to.active_element()                  定位到当前聚焦的元素上

driver.switch_to.default_content()                 切换到最上层页面(主文档?)

driver.switch_to.frame(frame_reference)      通过id、name、element(定位的某个元素)、索引来切换到某个frame

driver.switch_to.parent_frame() 这是switch_to中独有的方法,可以切换到上一层的frame,对于层层嵌套的frame很有用

★注意在定位时,报错的提示,如果是no alert这类提示,可能不需要用到switch_to

开始正式解决问题,首先查看163邮箱的元素页面

通过上图我们发现,id元素中包含很长一段数字,这种的一般动态生成的,所以尝试了使用id定位,没有成功。最后尝试使用元素定位的方式来解决,最后成功解决以上问题。

通过先定位iframe元素,然后再通过switch_to.frame()方法切换

from selenium import webdriver
import time

# 创建浏览器驱动driver

driver=webdriver.Chrome()
mail_url="http://www.mail.163.com"
# 访问指定网页
driver.get(mail_url)
driver.implicitly_wait(10)

# 有内嵌网页,需要先切换到内嵌frame网页再进行定位
driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))

# 定位账号输入框
driver.find_element_by_xpath('//input[@name="email"]').clear()  #删除提示信息
driver.find_element_by_xpath('//input[@name="email"]').send_keys("zhangsan")   #测试过程中替换成自己的账号名就可以

#定位密码输入框
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("12345678")  #测试过程中替换成自己的密码就可以

#定位登录按钮

driver.find_element_by_id("dologin").click()

driver.implicitly_wait(2000)
driver.quit()

Python自动化学习过程中,算是解决了一个遇到的小问题,也增加了对iframe嵌套网页的理解,继续学习中。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值