再谈Selenium 相对定位

前言:Selenium传统定位基本能解决80%的定位需求,但是还是有一些复杂场景传统定位定不到的场景。在现在框架横行的年代以及快速迭代的开发流程中,开发为了完成任务很多html文档都没有id,class或者其他易于识别的dom元素,虽然使用绝对路径能够定位到,但是你不能保证下次是有效的。因此大部分定位语法基本是使用相对路径定位的,但是相对定位也有个缺点就是有时候定位会有N个匹配,特别是笔者公司做的报表平台,很多控件是复用的,因此你定位到的元素不一定就是你想交互的元素,使用Selenium相对定位能很好解决这个痛点。

笔者在之前文文章有详细介绍相对定位的方法:Selenium Relative Locators 相对定位_知识的宝藏的博客-CSDN博客

本篇文章再做一些补充:

import logging
import time

import pytest
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import locate_with


class TestRelative:
    @pytest.mark.skip
    def test_relative_loc_locate_with(self):
        # 点击百度新闻信息
        driver = webdriver.Chrome()

        driver.get('https://www.baidu.com')
        driver.maximize_window()
        # driver.implicitly_wait(15)
        news_loc = (By.XPATH, "//*[@id='hotsearch-content-wrapper']//li//a//span[@class='title-content-title']")
        # 定位后返回RelativeBy对象,需要用find_elements来解析,locate_with比较适合定位多个元素的比如本例的新闻列表
        input_baidu = locate_with(*news_loc)
        elements = driver.find_elements(input_baidu)

        for element in elements:
            logging.info(element.get_attribute('textContent'))
            # logging.info(element.text)
            if element.get_attribute('textContent') == '书写历史 建立友谊 增进互信':
                element.click()
            time.sleep(1)
        assert '书写历史 建立友谊 增进互信' in driver.page_source
if __name__ == '__main__':
    pytest.main([])

其中to_right_of、above、to_left_of、below 传参类型为element_or_locator: Union[WebElement, Dict] = None,可以是webelement如:

 news_loc = (By.XPATH, "//*[@id='hotsearch-content-wrapper']//li//a//span[@class='title-content-title']")

 new_element=driver.find_element(*news_loc)

或者字典:

to_right_of({By.XPATH: "//*[@id='s-usersetting-top']"})

near方法多了一个int类型的入参表示相对其他定位元素的距离。可以使用near方法来识别距离所提供定位器最多50像素的元素

near(30)

你可能感兴趣的:(Selenium,selenium,测试工具)