1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 【基于Python的Selenium2自动化测试】04 - 模拟126邮箱的登录

【基于Python的Selenium2自动化测试】04 - 模拟126邮箱的登录

时间:2024-06-23 00:48:21

相关推荐

【基于Python的Selenium2自动化测试】04 - 模拟126邮箱的登录

首先打开126邮箱的登录页面如下:

所以我们要模拟的就是上图中的邮箱账号和密码的填写,以及登录按钮的点击事件。

通过Chrome的开发者工具(F12),我们可以看到上述元素的前端代码如下:

【邮箱账号或手机号】

<div class="u-input box" id="auto-id-1547015266203"><label class="u-label f-dn" id="auto-id-1547015266172" style="display: block;">邮箱帐号或手机号</label><input data-placeholder="邮箱帐号或手机号" name="email" data-type="email" data-loginname="loginEmail" data-required="true" class="j-inputtext dlemail" type="text" autocomplete="off" tabindex="1" spellcheck="false" id="auto-id-1547015266158" placeholder="邮箱帐号或手机号" style="width: 188px;" /><span class="pr-domain j-prdomain" style="right: -87px;">@</span></div>

【密码】

<div class="u-input box" id="auto-id-1547015266205"><label class="u-label f-dn" id="auto-id-1547015266181" style="display: block;">密码</label><input type="password" style="display:none;width:0;height:0;" /><input data-placeholder="密码" name="password" maxlength="50" data-required="true" class="j-inputtext dlpwd" type="password" autocomplete="new-password" data-max-length="50" tabindex="2" spellcheck="false" id="auto-id-1547015266161" placeholder="密码" /><input maxlength="50" data-placeholder="密码" type="text" id="pwdtext" class="u-pwdtext" placeholder="密码" /></div>

【登录按钮】

<div class="f-cb loginbox"><a href="javascript:void(0);" id="dologin" data-action="dologin" class="u-loginbtn btncolor tabfocus btndisabled" tabindex="8">登&nbsp;&nbsp;录</a></div>

【代码】

# coding=utf-8from selenium import webdriverimport timedriver = webdriver.Chrome()driver.get("")#执行邮箱登录操作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()time.sleep(5)driver.quit()

运行结果报如下错误:

mon.exceptions.NoSuchElementException: Message: Unable to locate element: [name="email"]

网上搜索寻找解决方法:

在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况(报mon.exceptions.NoSuchElementException),很常见的原因就是Frame/Iframe原因定位不到元素。

这个原因很常见,首先要理解下frame的实质,frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位。

如果iframe有name或id的话,直接使用switch_to_frame("name值")switch_to_frame("id值"),如果没有可用id或者name时,就需要通过其他的方法先定位到 iframe,再切换进去。。

我们还是通过Chrome开发者工具查看上述元素,发现在邮箱帐号登录下面果真有下面一行代码:

<iframe name="" frameborder="0" id="x-URS-iframe1547019659690.2905" scrolling="no" style="width: 100%; height: 100%; border: none; background: none;" src="/webzj/v1.0.1/pub/index_dl2_new.html?cd=https%3A%2F%%2Findex%2F126%2Fscripts%2F%2Fpc%2Fcss%2F&amp;cf=urs.3edc4a54.css&amp;MGID=1547019659690.2905&amp;wdaId=&amp;pkid=QdQXWEQ&amp;product=mail126"></iframe>

也就是说这里有页面嵌套问题

我们看到上面的页面元素,发现上面的iframename属性为空,虽然有id属性,但是这个id是动态生成的,每次打开后面的数字都是不一样的,所以,这时候我们需要通过采用其他方法先定位到该iframe,然后再切换进去。

【代码修改】

# coding=utf-8from selenium import webdriverimport timedriver = webdriver.Firefox()driver.get("")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()time.sleep(30)

运行结果,还是报错,如下:

mon.exceptions.NoSuchElementException: Message: Unable to locate element: //div[@id='loginDiv']/iframe

这时,遇到了新的问题,继续寻找度娘,最后找到了原因:其实是程序在打开网页后,进行下一步操作时,frame还未加载进来导致的。所以在定位frame元素之前,加一个延时操作,程序就能够顺利继续下去了。

【代码继续修改】

# coding=utf-8from selenium import webdriverimport timedriver = webdriver.Firefox()driver.get("")time.sleep(1) # 加一个延时操作,才能定位到下面的iframeiframe = 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()time.sleep(3)

运行代码后,发现没有报错,但是跟我们预想的结果不一样,没有直接登录到邮箱里面,而是出现了一个【是否更换手机号】的登录提示框。如下:

这里,我不需要更换手机号,直接点击【登录】就可以进入到邮箱里面了。

但是我们看到这个提示框也是嵌套页面,通过F12调试器看到如下嵌套代码:

解决方法:先从上一个iframe切回到主文档页面,然后再从主文档页面切入到这个新的提示框的iframe,最后再点击这个新的 iframe中的【登录】按钮即可。

【代码继续修改】

# coding=utf-8from selenium import webdriverimport timedriver = webdriver.Firefox()driver.get("")time.sleep(1) # 加一个延时操作,才能定位到下面的iframeiframe1 = driver.find_element_by_xpath("//div[@id='loginDiv']/iframe")driver.switch_to.frame(iframe1)#执行邮箱登录操作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()driver.switch_to.default_content() # 切回到主文档页面time.sleep(1) # 这里不加延时,也定位不到下面iframe中的[登录]按钮iframe2 = driver.find_element_by_xpath("//div[@id='loginDiv']/iframe")driver.switch_to.frame(iframe2)driver.find_element_by_link_text("登录").click()

点击,运行,终于是我们想要看到的结果了,如下:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。