• Selenium4之Relative Locators


    Selenium4引入了一些新特性,而Relative Locators就是其中之一。Relative Locators提供了以下5个方法:

    • above
    • below
    • to_left_of
    • to_right_of
    • near

    我们来过一下这些方法。为了方便我们学习,我们先创建一个HTML文件,取名test.html:

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>Just for testingtitle>
    6. head>
    7. <body>
    8. <h4>Nested Listh4>
    9. <ul>
    10. <li id="li1">li1li>
    11. <li id="li2">li2li>
    12. <li id="li3" class="cssstyle">
    13. <span id="span">test spanspan>
    14. li>
    15. <li id="li4" class="cssstyle">li4li>
    16. <li id="li5">li5li>
    17. ul>
    18. <span id="span1">span1span>
    19. <span id="span2">span2span>
    20. <span id="span3">span3span>
    21. <span id="span4" name="spanname4">span4span>
    22. <div class="cssstyle">
    23. Test div
    24. div>
    25. body>
    26. html>

      并在python代码里生成测试用的webelement实例对象:

    1. driver.get("http://localhost:63342/selenium4_demo/test.html")
    2. li1 = driver.find_element(By.ID, "li1")
    3. li2 = driver.find_element(By.ID, "li2")
    4. li3 = driver.find_element(By.ID, "li3")
    5. li4 = driver.find_element(By.ID, "li4")
    6. li5 = driver.find_element(By.ID, "li5")
    7. span1 = driver.find_element(By.ID, "span1")
    8. span2 = driver.find_element(By.ID, "span2")
    9. span3 = driver.find_element(By.ID, "span3")
    1.     above和below

         above(element_or_locator) --> 返回指定的页面元素或者定位字典上方元素的RelativeBy对象

         below(element_or_locator) --> 返回指定的页面元素或者定位字典下方元素的RelativeBy对象

         需要指出的是relative locators的所有方法都是支持链式访问的。

    1. for element in driver.find_elements(with_tag_name("li").below(li1).above(li5)):
    2. print(element.id, element.text, element.get_attribute("id"))

         因为above和below返回的是RelativeBy对象,所以如果想要得到WebElement实例对象,还需要将RelativeBy对象作为传差传递给find_element()或者find_elements()方法。 

         代码的输出如下:

    bf539a5c-afa6-4c31-a182-1a60453a5ee3 test span li3

         这里有些奇怪的是,理应返回li2, li3和li4才对,但在我给定的测试HTML里,确实只返回了li3。经过多次实验,above和below都忽略了离它们最近的一个符合条件的页面元素,比如below(li1)只返回li3,li4和li5, 而above(li5)只返回了li3,li2和li1。这直接导致我们的链式访问只返回li3一个元素。

      2.  to_left_of和to_right_of

    to_left_of(element_or_locator) --> 返回指定的页面元素或者定位字典左方元素的RelativeBy对象

    to_right_of(element_or_locator) --> 返回指定的页面元素或者定位字典右方元素的RelativeBy对象

    1. print(driver.find_element(with_tag_name("span").to_left_of(span2)).text)
    2. print(driver.find_element(locate_with(By.NAME, "spanname4").to_right_of(span2)).text)

    我们不光可以用tag_name来筛选相对位置的页面元素,也支持NAME,ID,CLASS_NAME等筛选方式。

    输出:

    1. span1
    2. span4

    3. near

    near(element_or_locator) --> 返回指定页面元素50PX内的页面元素的RelativeBy对象

    1. for element in driver.find_elements(with_tag_name("li").near({By.ID: "li3"})):
    2. print(element.id, element.text, element.get_attribute("id"))
    3. print(driver.find_element(with_tag_name("span").near(li2)).text)

    输出:

    1. f1104e9c-d1a8-4b10-9019-bb579ca4c427 li2 li2
    2. e416a7b4-0ad1-4d67-9cf4-bfaa13edb58f li4 li4
    3. c80b0456-9641-41c8-b3be-13421f020815 li1 li1
    4. 746f1190-8fa0-4779-8442-2b86f0e3444f li5 li5
    5. span3

    在Selenium4发布之前,Locator包括class name, css selector, id, name, link text, partial link text, tag name和xpath。坦白说,我的理解是,relative locators的出现,并不是解决能或是不能的问题,而是解决难或是易的问题。relative locators每个单独的方法都显得不是特别实用和必要,但是通过链式的组合定位,确实让一些原来难以定位的元素变得更加容易定位,并且可以做到更加优雅。也为我们在定位元素时提供了更多的选择。👍👍👍

  • 相关阅读:
    嵌入式-面试-八股文
    OData WebAPI实践-与ABP vNext集成
    [python基础] 面向对象——封装,继承
    使用STM32F103C8T自制freejoy控制板
    mysql基础 --函数
    salesforce零基础学习(一百一十七)salesforce部署方式及适用场景
    透过inode来理解硬链接和软链接
    【自然语言处理(NLP)】基于BiLSTM的关系抽取
    idea使用Alibaba Cloud Toolkit实现自动部署
    搞定蓝牙——第一篇(蓝牙发展史与简述)
  • 原文地址:https://blog.csdn.net/JZF2050/article/details/127837739