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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013003827/article/details/86165743

首先打开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;">@126.com</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-8
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("http://www.126.com")

#执行邮箱登录操作
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()

运行结果报如下错误:

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

网上搜索寻找解决方法:
在做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,再切换进去。。

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

  <iframe name="" frameborder="0" id="x-URS-iframe1547019659690.2905" scrolling="no" style="width: 100%; height: 100%; border: none; background: none;" 
  src="https://passport.126.com/webzj/v1.0.1/pub/index_dl2_new.html?
  cd=https%3A%2F%2Fmimg.127.net%2Findex%2F126%2Fscripts%2F2017%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-8
from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get("http://www.126.com")

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)

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

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

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

【代码继续修改】

# coding=utf-8
from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get("http://www.126.com")

time.sleep(1)  # 加一个延时操作,才能定位到下面的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()

time.sleep(3)

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

这里,我不需要更换手机号,直接点击【登录】就可以进入到邮箱里面了。
但是我们看到这个提示框也是嵌套页面,通过F12调试器看到如下嵌套代码:
在这里插入图片描述

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

【代码继续修改】

# coding=utf-8
from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get("http://www.126.com")

time.sleep(1)  # 加一个延时操作,才能定位到下面的iframe
iframe1 = 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()

点击,运行,终于是我们想要看到的结果了,如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013003827/article/details/86165743