版权声明:本文为博主原创文章,未经允许不得转载。https://blog.csdn.net/qiao_wan/article/details/94743908
网上很多基于Python利用第三方库Selenium进行126邮箱自动登录的测试脚本,但是在具体实现的过程中还是遇到了一些小问题,具体的实现及解决方法如下:
打开126邮箱登录首页,可以发现默认的登录方式是“手机扫码”方式。如果我们想要模拟通过 “账号 + 密码” 的方式自动登录,则首先需要点击“密码登录”文字,才可进入输入账号密码登录的界面,然后依次输入账号、密码、点击登录,则完成一次操作。
我们可以通过鼠标右击“密码登录”、“账号 ”、“ 密码” 的登录框,通过“web开发者工具”,查看上述元素的前端代码如下,截图如下:
1、查看“密码登录”按钮的前端代码:
2、查看“账号输入 ”框的前端实现代码,并定位查询其id、name等属性:
3、查看“密码输入 ”框的前端实现代码,并定位查询其id、name等属性:
4、查看“登录 ”按钮的前端实现代码,并定位查询其id、name等属性:
5、定位并查看iframe的结构内容:
注意内容:在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况(报selenium.common.exceptions.NoSuchElementException
),很常见的原因就是Frame/Iframe原因定位不到元素。
这个原因很常见,首先要理解下frame
的实质,frame
中实际上是嵌入了另一个页面,而 webdriver 每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位。
如果iframe
有name
或id
的话,直接使用switch_to_frame("name值")
或switch_to_frame("id值")
,如果没有可用 id
或者 name
时,就需要通过其他的方法先定位到 iframe
,再切换进去。
本例中,通过查看前端代码,通过driver.switch_to_frame("x-URS-iframe1562314804524.3333")
直接定位到到iframe
,发现报错,其原因是因为iframe
的ID是动态生成的,所以用其他方法定位到改iframe
(用其上一层父元素标签的唯一识别id/iframe
来定位),即iframe = driver.find_element_by_xpath("//div[@id = 'loginDiv']/iframe")
Python实现代码如下:
#_*_ coding:utf-8_*_
#Author: Wanqiao
#Created Time:2019/7/5 15:04
#file:login126.py
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.126.com")
driver.find_element_by_id("switchAccountLogin").click()
time.sleep(1)
# 直接定位到对应的frame
#driver.switch_to_frame("x-URS-iframe1562314804524.3333")
#因为frame的ID是动态生成的,所以用其他方法定位到改iframe(其上一层唯一识别id/iframe)
iframe = driver.find_element_by_xpath("//div[@id = 'loginDiv']/iframe")
driver.switch_to_frame(iframe)
#执行登录操作
driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("emailName")
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("passWord")
driver.find_element_by_id("dologin").click()