如何提升测试场景中绝对XPath定位的鲁棒性?针对动态DOM页面
定位鲁棒性优化方案
核心优化逻辑
抛弃依赖DOM层级的绝对XPath,改用元素的固定稳定特征组合做相对定位,the-internet的challenging_dom页面的蓝色按钮虽然id等属性动态变化,但仍有多个不变特征可以利用。
具体优化方法
- 改用相对XPath,基于按钮的样式特征定位:蓝色按钮的class属性始终包含
button,且不包含另外两个按钮特有的alert、success样式标识,完全不依赖DOM层级位置,即使页面结构调整只要按钮样式逻辑不变就能正常定位,XPath写法如下://a[contains(@class, 'button') and not(contains(@class, 'alert')) and not(contains(@class, 'success'))] - 如果担心样式规则后续调整,也可以结合固定父容器+顺序定位:按钮所在的左侧操作区父容器
div.large-2.columns属性固定,取该容器下第一个a标签即可,层级依赖比绝对XPath少得多,稳定性更高://div[contains(@class, 'large-2')]/a[1] - 增加显式等待逻辑,避免页面未加载完成导致的定位失败,进一步提升稳定性。
优化后代码示例
import pytest from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC #Test blue button on page, repeated 5 times and text displayed checked against options. @pytest.mark.repeat(5) def test_2(): # 显式等待最长10秒,直到元素可点击 elem1 = WebDriverWait(b, 10).until( EC.element_to_be_clickable((By.XPATH, "//a[contains(@class, 'button') and not(contains(@class, 'alert')) and not(contains(@class, 'success'))]")) ) a = elem1.text elem1.click() assert a in Names print(a)
内容的提问来源于stack exchange,提问作者David Costley
相关产品推荐
相关产品推荐

