解决selenium元素定位不到疑难杂症
//蓝色为个人总结性语言可能有误差,红色为重点语言,紫色为注释内容,这个为自学笔记和心得,学习资料来自于码尚教育B站一个视频
//开始之前请确保安装好selenium并测试完环境
一、八大元素定位(基础中的基础)
class By:
"""Set of supported locator strategies."""
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector“
自行回忆检测
二、页面未加载完成
页面上的元素可能由于网络延迟,JavaScript渲染等原因导致未加载完成,使用selenium元素定位会找不到
解决方式:
添加对应的等待时间,让元素充分加载完成之后再进行具体定位的操作
1.显示等待(用的最多最可靠)
#下载 pip install selenium.webdriver.
#导入包
from selenium.webdriver.support import expected_conditions as ECel = WebDriverWait(driver,
5).until(EC.presence_of_element_located((By.XPATH, '//*
[@id="1"]/div/h3/a')))
# driver.find_element(By.XPATH, '//*[@id="1"]/div/h3/a').click()
el.click()
2.隐式等待
# 隐式等待
driver.implicitly_wait(3)
3.强制等待
impot time'
Time.sleep()
三、框架内元素不可找
# 当元素在子页面的frame元素中需要进行切换定位
driver.switch_to.frame(driver.find_element(By.XPATH, '/html/frameset/frame[1]')) //大框架frame的定位
driver.find_element(By.XPATH, '//*[@id="navs"]/ul/li[2]/a').//click()真正元素定位
四.元素id或者属性变化
当页面中同一个元素每次值不一样的时候,那么使用常规定位元素的方式会出错
需要使用xpath提供的对应方法,进行手写xpath定位元素操作
以**开头
以**结尾
以及包含**
//*[@id="auto-id-ri6QaGIEhN3bTxsA"]
//*[@id="auto-id-ghlNbd98dkqJFidB"]
//*[@id="auto-id-4SCakBx15gzHDRud"]
# 定位以 auto-id- 开头的 id 元素
element = driver.find_element(By.XPATH, '//*[starts-with(@id, "auto-id-")]')
通过分析前台金融页面,登录成功和失败的提示信息:
成功://*[@id="fanwe_success_box"]/table/tbody/tr/td[2]/div[2]
失败://*[@id="fanwe_error_box"]/table/tbody/tr/td[2]/div[2]
# print(driver.find_element(By.XPATH, '//*
[@id="fanwe_error_box"]/table/tbody/tr/td[2]/div[2]').text)
# 不管是正例和反例的提示信息都要进行获取
# 可以通过手写xpath以**开头进行定位
text = driver.find_element(By.XPATH, '//*[starts-
with(@id,"fanwe_")]/table/tbody/tr/td[2]/div[2]').text
//把变化的去掉留下固定的就好
五.元素被遮挡
def close_msg(self):# 处理可能出现的弹窗if "确定" in self.driver.page_source:self.driver.find_element(By.XPATH, '//*[text()="确定"]').click()
六、元素不可交互
七、警告框处理
3,发送请求
driver.get(url)
driver.maximize_window()
driver.find_element(By.ID, 'alerta').click()
# 从当前页面切换到警告框里面
time.sleep(2)
alert = driver.switch_to.alert
# 获取警告框文本内容
time.sleep(2)
print(alert.text)
# # 取消警告框
# alert.dismiss()
# time.sleep(2)
# 点击确认:取消警告框
alert.accept()
八、内化为自己经验
参加完ccf,当时还找到了一个软件测试的面试,面试官就问了我这个过程中遇见了什么问题,怎么解决的,我说web自动化测试确实遇见了一个元素一直定位不到的问题,先尝试了显示等待,不可行,后面观察是不是在frame框架里面,成功解决问题,没有什么经验也可以按我这个模版现编。