selenium无法定位元素问题

在用自动化测试工具selenium完成下载任务时,经常会遇到定位不到元素的情况,总结如下:

1.frame/iframe原因定位不到元素:

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

解决方案:

如果iframe有name或id的话,直接使用switch_to_frame("name值")或switch_to_frame("id值")。如下:

driver = webdriver.Chrome()

driver.get(r‘http://www.126.com/‘)

driver.switch_to_frame(‘x-URS-iframe‘)  #需先跳转到iframe框架

username=driver.find_element_by_name(‘email‘)

username.clear()

如果iframe没有name或id的话,则可以通过下面的方式定位:

#先定位到iframe

elementi= driver.find_element_by_class_name(‘APP-editor-iframe‘)

#再将定位对象传给switch_to_frame()方法

driver.switch_to_frame(elementi)

如果完成操作后,可以通过switch_to.parent_content()方法跳出当前iframe,或者还可以通过switch_to.default_content()方法跳回最外层的页面。

2.页面还没有加载出来,就对页面上的元素进行的操作:

这种情况一般说来,可以设置等待,等待页面显示之后再操作,这与人手工操作的原理一样:

2.1设置等待时间;缺点是需要设置较长的等待时间,页面多了测试就很慢;

3.2设置等待页面的某个元素出现,比如一个文本、一个输入框都可以,一旦指定的元素出现,就可以做操作。

2.3在调试的过程中可以把页面的html代码打印出来,以便分析。

解决方案:

导入时间模块。

import time

time.sleep(3)

3.二次定位,如弹出框登录

如百度登录弹出框登录百度账号,需先定位到百度弹出框,然后再定位到用户名密码登录。

# coding=utf-8

from selenium import webdriver

import time

driver = webdriver.Chrome()

driver.get("http://www.baidu.com/")

time.sleep(3)

#点击登录:有些name为tj_login的元素为不可见的,点击可见的那个登录按钮即可。

#否则会报:ElementNotVisibleException

element0=driver.find_elements_by_name("tj_login")

for ele0 in element0:

if ele0.is_displayed():

ele0.click()

#在登录弹出框,需先定位到登录弹出框

#否则会报:NoSuchElementException

element1=driver.find_element_by_class_name("tang-content")

element11=element1.find_element_by_id("TANGRAM__PSP_8__userName")

element11.clear()

element11.send_keys("登录名")

element2=element1.find_element_by_id("TANGRAM__PSP_8__password")

element2.clear()

element2.send_keys("密码")

element3=element1.find_element_by_id("TANGRAM__PSP_8__submit")

element3.click()

element3.submit()

try:

assert "登录名" in driver.page_source

except AssertionError:

print "登录失败"

else:

print "登录成功"

time.sleep(3)

finally:

print "测试记录:已测试"

driver.close()

补充:报:selenium.common.exceptions.ElementNotVisibleException

4.不可见元素定位

如上百度登录代码,通过名称为tj_login查找的登录元素,有些是不可见的,所以加一个循环判断,找到可见元素(is_displayed())点击登录即可。

时间: 2024-10-12 10:46:50

selenium无法定位元素问题的相关文章

selenium+python定位元素方法

定位元素方法 官网地址:http://selenium-python.readthedocs.org/locating-elements.html        这里有各种策略用于定位网页中的元素(locate elements),你可以选择最适合的方案,Selenium提供了一下方法来定义一个页面中的元素: find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_e

使用findElement方法定位元素

selenium WebDriver定位元素是通过findElement()和findElements()方法. findElement()方法返回一个基于指定查询条件的WebElement对象或是抛出一个没有找到符合条件元素的异常. findElements()方法会返回匹配指定查询条件的webElements对象的集合,如果没有找到则返回空. 查询方法会将By实例作为参数传入.Selenium WebDriver提供了By类来支持各种查询策略. 策略: 方法 By  ID   driver.

【Selenium WebDriver】元素定位函数 FindElement

定位Web页面上的元素,用FindElement函数,它可以根据元素的不同属性来快速定位.具体的属性如下: 例子: HTML页面文件: 1 <html xmlns="http://www.w3.org/1999/xhtml" lang="en-us"> 2 <head> 3 <body> 4 <form name="loginForm"> 5 <label for="username

[selenium webdriver Java]元素定位——findElement/findElements

策略 语法 语法 描述 By id driver.findElement(By.id()) driver.findElements(By.id()) 通过id属性定位元素 By name driver.findElement(By.name()) driver.findElements(By.name()) 通过name属性定位元素 By class name driver.findElement(By.className()) driver.findElements(By.className(

Selenium自动化测试之元素定位

一.Selenium定位方法 自动化测试的关键是要准确的操作测试对象,所以就需要对被测系统的页面元素做精确的定位:有以下几种定位方法: By.classNme(String className) By.cssSelector(String selector) By.id(String id) By.linkText(String linkText) By.name(String name) By.partialLinkText(String linkText) By.tagName(String

selenium切换窗口后定位元素出现问题的解决方案

在做UI自动化的过程中,有时需要由一个窗口跳转到另一个窗口,这时直接去定位页面元素,可能会出现问题,这时,我们需要将driver与新的窗口进行绑定. 完整代码如下:(python版) #coding=utf-8 import os from selenium import webdriver import time chrome = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe' os.environ["we

selenium中的webdriver定位元素失败的常见原因

自动化测试中经常会出现无法定位元素的情况,报selenium.common.exceptions.NoSuchElementException错误 Frame/Iframe原因定位不到元素: 这个是最常见的原因,首先要理解下frame的实质,frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位. 解决方案: 如果iframe有name或id的话,直接使用switch_to_frame("name值"

【Selenium专题】元素定位之CssSelector

CssSelector是我最喜欢的元素定位方法,Selenium官网的Document里极力推荐使用CSS locator,而不是XPath来定位元素,原因是CSS locator比XPath locator速度快,特别是在IE下面(IE没有自己的XPath 解析器(Parser))他比xpath更高效更准确更易编写,美中不足是根据页面文字时略有缺陷没有xpath直接. 因为前端开发人员就是用CSS Selector设置页面上每一个元素的样式,无论那个元素的位置有多复杂,他们能定位到,那我们使用

selenium+python之元素定位方式介绍

网页自动化测试最基本的要求就是要定位到各个元素,然后才能对该元素进行各种操作(输入,点击,清除,提交等),所以今天来总结下Selenuim+Python最基本的几种定位方式及实例说明, 以百度搜索输入框为例,用谷歌浏览器具体说明各个定位方式的用法. 1.导入selenium包的webdriver方法 输入 from selenium import webdriver 2.从 time 模块中引入sleep函数,使用sleep函数可以让程序休眠 输入 from time import sleep