在看《Selenium2自动化测试实战》4.6获得验证信息时出现各种NoSuchElementException问题,甚是崩溃,尝试各种元素定位方法,都以失败告终,最后发现Selenium使用webdriver只能在一个页面识别,而126邮箱的登陆页面嵌套着frame,因此需要先跳转至对应frame,才能使用元素定位法。
另外,具体定位问题可参考:Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException),我也是参考这一篇博客的,但是对于126对页面的修改使得frame跳转不能直接使用id,后续代码中有需改方法。
1. 我遇到的问题
(1)用户名、密码、frame的id是动态变化的,所以不能用id了;
(2)登陆框,嵌在frame中,所以不正确跳转frame就不能定位元素。
2. 解决
(1)查看页面后发现用户名和密码框对应的class是不改变的,直接使用class
(2)修改参考博客中driver.switch_to_frame('x-URS-iframe') 为driver.switch_to.frame("")。括号中的内容是可以填id或那么,因为id不可用,所以填name,html页面中name=“”。
(3)发现find_element_by_xpath定位方法是最为通用的,可以使用xpath定位到大部分元素。
3. 代码
from selenium import webdriver
from time import *
driver = webdriver.Firefox()
driver.get("http://www.126.com")
#sleep延迟用于更好的看执行效果
sleep(3)
driver.switch_to.frame("")
print("Login Before"+"="*30)
title = driver.title
print("title:",title)
now_url = driver.current_url
print(now_url)
sleep(3)
driver.find_element_by_xpath("//input[@class='j-inputtext dlemail j-nameforslide']").clear()
driver.find_element_by_xpath("//input[@class='j-inputtext dlemail j-nameforslide']").send_keys("username")
sleep(3)
driver.find_element_by_xpath("//input[@class='j-inputtext dlpwd']").clear()
driver.find_element_by_xpath("//input[@class='j-inputtext dlpwd']").send_keys("password")
sleep(3)
driver.find_element_by_xpath("//a[@id='dologin']").click()
print("Login after"+"="*30)
title = driver.title
print("title:",title)
now_url = driver.current_url
print(now_url)
user = driver.find_element_by_xpath("//span[@id='spnUid']").text
print(user)
driver.quit()
4. 其他参考