ID变化导致selenium无法定位到元素

ID变化导致selenium无法定位到元素

最近在学习selenium2基于python3做自动化测试,写了一个小脚本,完成163邮箱的登录功能。

通过页面元素定位账号和密码输入框

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
#登陆163邮箱
driver.get("https://email.163.com/")
#界面切换会加载,防止速度过快定位不到元素,添加sleep,等待2秒
sleep(2)
driver.find_element_by_id('auto-id-1584348251224').clear()
driver.find_element_by_id('auto-id-1584348251224').send_keys("输入账号")
driver.find_element_by_id('auto-id-1584348251233').clear()
driver.find_element_by_id('auto-id-1584348251233').send_keys("输入密码")
sleep(1)
driver.find_element_by_id("dologin").click()

执行后报错 selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element:

经过查找后发现,很多大型网站出于安全考虑,使用了动态ID,每次打开163网站所获取到的账号和密码的ID都不一样,所以修改定位方式,使用xpath定位。
(可使用工具定位,若工具无法定位到或者一个属性不能唯一的区分一个元素,可以使用逻辑运算符连接多个属性来查找元素)

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
# 登陆163邮箱
driver.get("https://email.163.com/")
# 界面切换会加载,防止速度过快定位不到元素,添加sleep,等待2秒
sleep(2)
driver.find_element_by_xpath("//input[@name='email' and @data-type='email']").send_keys("输入账号")
driver.find_element_by_xpath("//input[@name='password']").clear()
driver.find_element_by_xpath("//input[@name='password']").send_keys("输入密码")
sleep(1)
driver.find_element_by_id("dologin").click()

这个时候发现依然无法找到元素,再次查找原因,发现frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,所以需要先定位到相应的frame,对那个页面里的元素进行定位。

driver.switch_to.frame(driver.find_element_by_xpath(’/html[1]/body[1]/div[1]/div[2]/div[2]/div[1]/div[2]/div[2]/div[1]/div[1]/iframe[1]’))

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
# 登陆163邮箱
driver.get("https://email.163.com/")
# 界面切换会加载,防止速度过快定位不到元素,添加sleep,等待2秒
sleep(2)
# 先定位到相应的frame
driver.switch_to.frame(driver.find_element_by_xpath('/html[1]/body[1]/div[1]/div[2]/div[2]/div[1]/div[2]/div[2]/div[1]/div[1]/iframe[1]'))
driver.find_element_by_xpath("//input[@name='email' and @data-type='email']").clear()
driver.find_element_by_xpath("//input[@name='email' and @data-type='email']").send_keys("输入账号")
driver.find_element_by_xpath("//input[@name='password']").clear()
driver.find_element_by_xpath("//input[@name='password']").send_keys("输入密码")
sleep(1)
driver.find_element_by_id("dologin").click()
sleep(2)
driver.quit()

再次执行脚本,这样就能成功登陆。

补充几种Selenium常见的无法定位到元素的原因
https://www.cnblogs.com/cyq0528/p/12157248.html

注:
------------------------------------------------------------------------------------------
虽然xpath 和CSS 可以定位到复杂且比较难定位的元素,但相比较用id 和name 来说增加了维护成本和学习成本,相比较来说id/name 的定位方式更直观和可维护,有新的成员加入的自动化时也增加了人员的学习成本。所以,测试人员在实施自动化测试时一定要做好沟通,规范前端开发人员对元素添加id/name 属性,或者自己有修改HTML 代码的权限。

你可能感兴趣的:(Web自动化测试)