一、元素定位以及可能出现的问题
1、简单的元素定位
打开页面后,第二件事情就是定位到我们要操作的页面元素,定位单个页面元素有如下方法(下面的方法,如果没有定位到相应的元素,抛出NoSuchElementException异常):
- find_element_by_id:通过id属性定位元素(返回第一个匹配的)。
- find_element_by_name:通过name属性定位元素(返回第一个匹配的)。
- find_element_by_xpath:通过xpath定位元素(返回第一个匹配的)。
- find_element_by_link_text:通过超链接文本定位超链接元素,必须是完全匹配(返回第一个匹配的)。
- find_element_by_partial_link_text:通过超链接文本定位超链接元素,可以是部分匹配(返回第一个匹配的)。
- find_element_by_tag_name:通过标签名字定位元素(返回第一个匹配的)。
- find_element_by_class_name:通过class属性定位元素(返回第一个匹配的)。
- find_element_by_css_selector:使用CSS选择器语法定位元素(返回第一个匹配的)。
此外,webdriver还有find_element及find_elements方法定位元素:
from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')
ID :元素id属性。
XPATH:xpath。
LINK_TEXT :超链接文本。
PARTIAL_LINK_TEXT :部分超链接文本。
NAME :元素name属性。
TAG_NAME :元素标签名字。
CLASS_NAME :元素class属性。
CSS_SELECTOR :使用CSS元素选择器语法。
2、部分难以定位的元素
(1)frame/iframe表单嵌套
解决方法:driver.switch_to.frame()
driver.switch_to.parent_frame() 切回到父frame
driver.switch_to.default_content() 跳回最外层的页面
a = ff.find_element_by_tag_name("a")
# 保存原始窗口,window_handlers是目前wd打开的所有窗口的句柄列表
prev = ff.window_handles[-1]
# 点击超链接(targe="_blank")后,浏览器新窗口被激活
a.click()
# 保存新窗口
new = ff.window_handles[-1]
# 切换到原始窗口
ff.switch_to_window(prev)
print "Switch to prev success"
# 切换到新窗口
ff.switch_to_window(new)
print "Switch to new success"
(2)页面跳转到新的标签页(窗口切换)
解决方法:driver.switch_to.window(window_handle)切换到新窗口。
windows = self.driver.window_handles
self.driver.switch_to.window(windows[1])
#或者for循环遍历
for handle in driver.window_handles:
# 先切换到该窗口
wb.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判断是不是要操作的窗口
if '窗口标题' in driver.title:
# 如果是,那么WebDriver对象就是对应的该窗口,跳出循环
break
(3)弹出警告框(alert/confim/prompt)
解决方法:alert = driver.switch_to.alert,其中
alert窗口:提示用户信息仅有确认按钮
confirm窗口:有确认和取消按钮
prompt窗口:有输入框、确认和取消按钮
text: 返回(获取)alert/confirm/prompt中的文字信息
accept():接受现有警告框
dismiss(): 放弃现有警告框
send_keys(keys_ToSend):发送文本至警告框
#切换到alert
alert = self.driver.switch_to.alert
print(alert.text)
sleep(2)
alert.accept()
#confirm弹框
self.driver.find_element_by_id('confirm').click()
confirm = self.driver.switch_to.alert
print(confirm.text)
sleep(3)
#确定
# confirm.accept()
#取消
confirm.dismiss()
#prompt弹框
self.driver.find_element_by_id('prompt').click()
prompt = self.driver.switch_to.alert
print(prompt.text)
prompt.send_keys('20')
sleep(3)
prompt.accept()
(4)元素动态变化
解决方法:通过XPATH来定位,driver.find_element( By.XPATH, "" )
(5)页面元素失去焦点导致脚本运行不稳定
解决方法:driver.switch_to.active_element
(6)页面没有加载出来,对页面元素操作
解决方式:三种等待
#1、WebDriverWait() 显示等待。等待单个的元素加载,通常配合until()、until_not()方法使用。
WebDriverWait(driver, 10,0.5).until(driver.find_element( By.CSS_SELECTOR,""))
#2、time.sleep( ) 强制等待。当执行下一句代码,这种等待方式时间到了就执行下一个语句,但不能保证在等待的时间内元素真正被加载了出来。
time.sleep(10) # 表示强行等待10s
#3、driver.implicitly_wait() 隐式等待。表示在规定的时间内页面的所有元素都加载完了就执行下一步,否则一直等到时间截止,然后再继续下一步。
driver.implicitly_wait(30) #等待30s

本文详细介绍了Web自动化测试中元素定位的常见方法与解决疑难问题,包括frame/iframe、警告框、动态元素等,并探讨了对定位元素进行的一般和复杂操作,如组合键、鼠标操作和alert处理。此外,文章还讲解了Page Object Model(POM)设计模式在代码封装中的应用,以及如何将测试集成到Jenkins中,实现自动化测试流程。
最低0.47元/天 解锁文章
2215





