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

最近在学习用selenium2基于python3做自动化测试,写了一个小脚本,完成360云盘的登录功能;

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

# coding = utf-8

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://c56.yunpan.360.cn/")

driver.find_element_by_id("quc_account_55212773").clear()
driver.find_element_by_id("quc_account_55212773").send_keys("xxxx")  #账号名
driver.find_element_by_id("quc_password_55212774").clear()
driver.find_element_by_id("quc_password_55212774").send_keys("xxxx")   #密码
driver.find_element_by_xpath('/html/body/div[2]/div/div[3]/div[1]/div/div[2]/form/p[5]/input').click()


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

无法定位到元素,经过查找发现,每次打开360云盘网页,账号输入框ID和密码输入框ID都是不同的,因此无法通过ID定位;

修改脚本,通过xpath定位:

# coding = utf-8

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://c56.yunpan.360.cn/")

driver.find_element_by_xpath("/html/body/div[2]/div/div[3]/div[1]/div/div[2]/form/p[1]/span/input").clear()
driver.find_element_by_xpath("/html/body/div[2]/div/div[3]/div[1]/div/div[2]/form/p[1]/span/input").send_keys("XXXX")
driver.find_element_by_xpath("/html/body/div[2]/div/div[3]/div[1]/div/div[2]/form/p[2]/span/input").clear()
driver.find_element_by_xpath("/html/body/div[2]/div/div[3]/div[1]/div/div[2]/form/p[2]/span/input").send_keys("XXX")
driver.find_element_by_xpath('/html/body/div[2]/div/div[3]/div[1]/div/div[2]/form/p[5]/input').click()

再次执行脚本,可以进行登录,问题解决。

通过上面的例子,我们可以看到xpath 的定位方式非常灵活和强大的,但是它的缺陷也非常明显:

1、性能差,定位元素的性能要比其它大多数方式差;

2、不够健壮,xpath会随着页面元素布局的改变而改变;

3. 兼容性不好,在不同的浏览器下对xpath 的实现是不一样的。

    另外,CSS 定位语法比xpath 更为简洁,定位方式更多灵活多样;不过对CSS 理解起来要比xpath 较难;但不管是从性能还是定位更复杂的元素上,CSS 优于xpath,笔者更推荐使用CSS定位页面元素。

    自动化测试的元素定位一直是困扰自动化测试新手的一个障碍,因为我们在自动化实施过程中会碰到各式各样的对象元素。虽然xpath 和CSS 可以定位到复杂且比较难定位的元素,但相比较用id 和name 来说增加了维护成本和学习成本,相比较来说id/name 的定位方式更直观和可维护,有新的成员加入的自动化时也增加了人员的学习成本。所以,测试人员在实施自动化测试时一定要做好沟通,规范前端开发人员对元素添加id/name 属性,或者自己有修改HTML 代码的权限。

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