ui自动化 xpath相对定位方法大全 与等待

本文详细介绍了XPath的各种定位方式,包括相对定位、ID定位、class定位、文本定位、模糊定位及逻辑运算符的使用,并深入解析了等待策略,如强制等待、显性等待和隐性等待,以及各种等待条件的应用。

一、xpath相对定位

1 相对定位 -- 以// 开头 如://form//input[@name="phone"]

1.1 使用id定位 -- driver.find_element_by_xpath('//input[@id="kw"]')

1.2 使用class定位 -- driver.find_element_by_xpath('//input[@class="s_ipt"]')

3.1【文本定位】使用text()元素的text内容 如://button[text()="登录"]

3.2 【模糊定位】使用contains() 包含函数 如://button[contains(text(),"登录")]、//button[contains(@class,"btn")] 除了contains不是=等于

3.3 【模糊定位】使用starts-with -- 匹配以xx开头的属性值;ends-with -- 匹配以xx结尾的属性值  如://button[starts-with(@class,"btn")]、//input[ends-with(@class,"-special")]

3.4  使用逻辑运算符 -- and、or;如://input[@name="phone" and @datatype="m"]

//input[@name="phone" and text()="textvalue"]

4.轴定位

4.1  轴运算

  ancestor:祖先节点 包括父
  parent:父节点
  prceding-sibling:当前元素节点标签之前的所有兄弟节点
  prceding:当前元素节点标签之前的所有节点 

  following-sibling:当前元素节点标签之后的所有兄弟节点

  following:当前元素节点标签之后的所有节点 

       使用语法: 轴名称 :: 节点名称

       //a[@id = 'result_logo']/following-sibling::form[@name='f']

二、等待

强制等待  :time.sleep()  不确定等多久,一次性的

显性等待:专人看,每隔多久5秒看一次。

重写显性等待 

def wait_click_element(driver,locator):
    wait = WebDriverWait(driver,20)
    return wait.until(EC.element_to_be_clickable(locator))

1.定时器

wait = WebDriverWait(driver,20)

2.设置条件(等待某一种条件) 

e = wait.until(EC.element_to_be_clickable(By.id,"kw"))   当元素可以被点击的时候

常用条件:

wait.until(EC.visibility_of_element_located(By.id,"kw"))  当元素可见的时候
wait.until(EC.presence_of_element_located(By.id,"kw"))    当元素存在的时候

不常用条件:

'''判断是否至少有1个元素存在于dom树中,如果定位到就返回列表'''
WebDriverWait(driver,10,0.1).until(EC.presence_of_all_elements_located((locator)))


'''判断是否至少有一个元素在页面中可见,如果定位到就返回列表'''
WebDriverWait(driver,10,0.1).until(EC.visibility_of_any_elements_located((locator)))


'''判断指定的元素中是否包含了预期的字符串,返回布尔值'''
WebDriverWait(driver,10,0.1).until(EC.text_to_be_present_in_element((locator),'预期text'))


'''判断指定元素的value属性值中是否包含了预期的字符串,返回布尔值(注意:只是value属性)'''
WebDriverWait(driver,10,0.1).until(EC.text_to_be_present_in_element_value((locator),'预期的text'))


'''判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False'''
WebDriverWait(driver,10,0.1).until(EC.frame_to_be_available_and_switch_to_it(locator))


'''判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素'''
WebDriverWait(driver,10,0.1).until(EC.invisibility_of_element_located((locator)))


'''判断某个元素是否可见并且是可点击的,如果是的就返回这个元素,否则返回False'''
WebDriverWait(driver,10,0.1).until(EC.element_to_be_clickable((locator)))


'''等待某个元素从dom树中移除'''
WebDriverWait(driver,10,0.1).until(EC.staleness_of(driver.find_element(locator)))


'''判断某个元素是否被选中了,一般用在下拉列表'''
WebDriverWait(driver,10,0.1).until(EC.element_to_be_selected(driver.find_element(locator)))


'''判断某个元素的选中状态是否符合预期'''
WebDriverWait(driver,10,0.1).until(EC.element_selection_state_to_be(driver.find_element(locator),True))



'''判断某个元素的选中状态是否符合预期'''
WebDriverWait(driver,10,0.1).until(EC.element_located_selection_state_to_be((locator),True))


'''判断页面上是否存在alert,如果有就切换到alert并返回alert的内容'''
accept = WebDriverWait(driver,10,0.1).until(EC.alert_is_present())

方法原理:

隐形等待:只需要设置一次,例如安装摄像头。一般在打开网站之前使用设置。driver.implicitly_wait(5)  每个元素在找之前都会等5秒钟。缺点:局限性高,只能用来等元素或者某个指令没有完成。并不能等待所有的情况。

 

<think>嗯,用户问的是在UI自动化测试中如何处理界面刷新导致元素定位失败的问题。首先,我需要回忆一下相关的解决方案。记得之前学过的显式等待,比如WebDriverWait配合expected_conditions,这样可以等待元素出现后再操作,避免因为页面还没加载完而找不到元素。然后,隐式等待可能也是个办法,设置一个全局的等待时间,让driver自动等待元素出现。不过显式等待更灵活,应该优先推荐显式。 另外,页面刷新后元素可能会重新渲染,这时候可能需要重新定位元素。有时候元素在iframe里面,所以需要检查是否有iframe没有切换进去,或者刷新后iframe结构变了。还有,用户可能遇到的是页面跳转后窗口句柄变化的情况,比如打开新标签页,这时候需要切换窗口句柄,类似引用[4]里提到的方法。不过这个问题主要是刷新,可能不是新窗口,但还是要考虑。 动态元素的问题,比如ID或者属性每次刷新都会变化,这时候用XPath的相对路径或者CSS选择器更可靠,比如用contains或者starts-with函数。引用[1]和[3]都提到了XPath和CSS选择器的使用。另外,JavaScript执行完成后的状态也很重要,可能需要等待Ajax请求完成,或者某些JS效果加载完毕,可以用WebDriverWait来检查特定条件,比如元素可见、可点击等。 重试机制也是一个可能的解决方案,如果第一次定位失败,可以尝试几次重新定位,结合异常捕获,比如try-except块,在捕捉到NoSuchElementException后等待一段时间再重试。还有,页面刷新后可能会有旧元素的引用失效,所以应该在刷新后重新获取元素,而不是使用之前的对象。 综合这些点,我应该把这些方法分点列出,给出具体的代码示例,比如使用WebDriverWait的代码,如何处理动态元素,以及重试机制的例子。同时要引用相关的资料,比如引用[1]、[3]、[4]中的内容,确保回答有据可依。最后生成相关问题,比如显式等待和隐式等待的区别,处理动态元素的方法,或者处理iframe的策略,这样用户可以有进一步学习的路径。</think>### UI自动化测试中界面刷新导致元素定位问题的解决方案 #### 1. 显式等待机制 使用`WebDriverWait`配合`expected_conditions`,可精准控制元素加载等待时间。例如等待元素可见后再操作: ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.XPATH, "//button[@class='submit']")) ) ``` 该方法能有效避免因界面刷新延迟导致的元素定位失败[^3]。 #### 2. 隐式等待配置 通过`driver.implicitly_wait(10)`设置全局等待时间,所有元素定位操作都会自动等待指定时长。需注意隐式等待对动态加载内容的支持有限,建议显式等待结合使用。 #### 3. 动态元素定位策略 - **XPath相对路径**:使用`contains()`、`starts-with()`等函数处理动态属性 ```python driver.find_element(By.XPATH, "//div[contains(@id,'dynamic_part')]") ``` - **CSS选择器**:通过部分属性匹配定位 ```python driver.find_element(By.CSS_SELECTOR, "input[name^='user_']") ``` 优先推荐XPath/CSS选择器而非固定属性值[^1]。 #### 4. 页面状态检测 在关键操作后添加状态验证逻辑: ```python WebDriverWait(driver, 15).until( lambda d: d.execute_script("return document.readyState") == "complete" ) ``` 该方法可确保页面完全加载后再进行后续操作。 #### 5. 重试机制实现 通过异常捕获实现自动重试: ```python from selenium.common.exceptions import StaleElementReferenceException from tenacity import retry, stop_after_attempt @retry(stop=stop_after_attempt(3)) def safe_click(element): try: element.click() except StaleElementReferenceException: element = driver.find_element(By.ID, "refresh_element") element.click() ``` #### 6. 框架级处理方案 - **Page Object模式**:封装元素定位逻辑,在页面刷新后自动重新初始化元素 - **自动重试配置**:在测试框架中集成自动重试机制(如pytest的`rerun`插件)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值