• 微软出品自动化神器【Playwright+Java】系列(十)元素定位详解


    一、写在前面

    又有很久没更文了,真的是被催婚搞的整个人情绪特别不好,如果硬要形容的话,那就是没法跟人正常沟通,一点就着,做什么都没耐心,看什么都烦,简直没救了...

    也是偶然发现的,自己居然没写关于Playwright的元素定位,这不是自动化测试的重中之重,怎么可以忘,马上安排!

    二、元素定位

    主要支持定位方式有:css、xpath、text

    示例代码如下:

    java
    //选择单个元素
    page.querySelector("selector");
    //选择多个元素
    page.querySelectorAll("selector");
    //选择单个元素,并且自动等待到元素可见、可操作
    page.waitForSelector("selector");

    三、CSS定位

    1、css+定位值

    可以理解为指定为:css方式定位+使用的定位方式(css选择器语法)

    示例代码如下:

    java
    page.locator("css=[type='text']")

    2、通过其文本内容匹配元素

    元素标签+:has-text()

    :has-text()匹配任何包含指定文本的元素,在内部的某个地方,可能在子元素或后代元素中。匹配不区分大小写,理解为模糊匹配,应注意与其他CSS说明符一起使用,否则将匹配所有包含指定文本的元素,包括

    示例代码如下:

    java
    List elements = page.querySelectorAll("button:has-text("Button")");
    System.out.println(elements.size());// 5
    ```html
    #### 3、在指定元素中查找匹配文本的元素
    `:text()`匹配包含指定文本的最小元素。匹配不区分大小写,还是模糊匹配,就是指定范围了。
    
    **示例代码如下:**
    ```java
    page.querySelector("article .ant-row :text("Open Modal")").click();

    4、文本通过正则表达式匹配

    匹配文本内容与类似JavaScript的正则表达式匹配的最小元素。

    示例代码如下:

    java
    page.querySelector("article .ant-row :text-matches("Open M\o*dal", "i")")

    5、仅匹配可见元素

    示例dom:

    html
    <button style='display: none'>Invisiblebutton>
    <button>Visiblebutton>

    示例代码如下:

    java
    page.locator("button:visible").click();

    注意:
    文本匹配会规范化空格。例如,它将多个空格变成一个,将换行符变成空格,并忽略前后空格。

    6、在给定范围内元素,匹配元素

    给定元素的范围的参数传递的任何选择器至少匹配一个元素,它将返回一个元素,也是模糊匹配!
    示例代码如下:

    java
    page.navigate("http://localhost:8080/wait.html");
    page.querySelector("#wait").click();
    String content = page.waitForSelector("div:has(p)").textContent();
    System.out.println(content);

    7、匹配条件之一的元素

    以逗号分隔,从CSS选择器列表将匹配该列表中的选择器之一可以选择的所有元素,简单说就是从这么多列表中找到一个匹配的选择器去选择元素。
    示例代码如下:

    java
    page.navigate("https://antdv.com/components/modal-cn");
    page.waitForSelector("#components-modal-demo-basic .code-box-demo span").click();
    page.locator("button:has-text("取 消"), button:has-text("确定")").click();

    8、基于布局匹配定位元素

    基于页面布局定位,上下左右之类的,会有当页面布局改变时,会出现找不到元素或者匹配其他元素的情况。

    示例代码如下:

    java
    //在promo-card附近的元素
    page.locator("button:near(.promo-card)").click();
    //获取(promo-card2)元素右侧元素文本
    String textContent3 = page.waitForSelector("button:right-of(#card2)").textContent();
    System.out.println("textContent3: "+textContent3);
    //获取(promo-card2)元素左侧元素文本
    String textContent1 = page.waitForSelector("button:left-of(#card2)").textContent();
    System.out.println("textContent1: "+textContent1);
    //获取(promo-card2)元素上面元素属性
    String above = page.waitForSelector("button:above(#card2)").getAttribute("id");
    System.out.println("above: "+above);
    //获取(promo-card2)元素下面元素属性
    String below = page.waitForSelector("button:below(#card2)").getAttribute("id");
    System.out.println("below: "+below);

    9、从查询结果中选择第n个元素匹配

    与: nth-child()不同,元素不必是兄弟姐妹,它们可以在页面上的任何位置元素。

    示例代码如下:

    java
    page.waitForSelector(":nth-match(:text('promo-card'), 2)").click();

    10、第N个元素定位器

    选择索引的的方式定位。

    示例代码如下:

    java
    //获取第一个元素的文本
    String first = page.locator("button").locator("nth=0").textContent();
    //获取最后一个元素的文本
    String last = page.locator("button").locator("nth=-1").textContent();
    System.out.println(first+"\n"+last);

    11、仅定位可见元素

    一个页面有两个按钮,第一个不可见,第二个可见,示例:

    highlighter- HTML
    <button style='display: none'>Invisiblebutton>
    <button>Visiblebutton>

    示例代码如下:

    java
    page.locator("button").locator("visible=true").click();

    三、XPath定位

    任何以//或…开头的选择器被假定为xpath选择器。例如,Playwright将'//html/body'转换为'xpath=//html/body'。

    1、XPath混合使用

    特性就是管道符|的使用,在XPath中可指定多个选择器。它将匹配该列表中的选择器之一可以选择的所有元素。

    示例代码如下:

    java
    page.navigate("https://antdv.com/components/modal-cn");
    page.querySelector("#components-modal-demo-basic .code-box-demo span").click();
    page.locator("//div[@id='vcDialogTitle0']|//div[@role='documentcontent']").waitFor();
    System.out.println();

    2、常见XPath定位使用

    完全支持XPath定位和CSS语法,这里没法可说的,个人感觉是完美兼容SeleniumCSS 、XPath定位定位方式的,参考学习CSS定位入门XPATH定位入门这两篇。

    四、使用文本定位

    使用文本定位:以引号 "" 或者 ' 开头的,可以判定为文本定为文本定位。

    1、包含

    示例代码如下:

    java
    //包含
    String content = page.textContent("button:text('card0')");

    2、严格匹配

    示例代码如下:

    java
    //严格匹配
    String content1 = page.textContent("button:text-is('card0')");

    3、正则表达式匹配

    示例代码如下:

    java
    //正则
    String content2 = page.textContent("button:text-matches("ca\r*d0")");

    五、使用属性选择器定位

    不是CSS选择器,因此不支持任何特定于CSS的选项。

    示例代码如下:

    java
    page.fill("id=user","username1");
    page.type("data-testid=testid","username2");

    六、使用链式选择器定位

    选择器被链接时,下一个选择器相对于前一个选择器的结果被查询,个人感觉就是按照层级去定位元素。

    示例代码如下:

    java
    page.navigate("https://2x.antdv.com/components/modal-cn");
    page.click("#components-modal-demo-basic .code-box-demo span");
    page.click("div[role="dialog"] >> div[role="document"] >> text="取 消"");
    System.out.println();

    七、写在最后

    Playwright系列的第九篇文中说,一个不留神就更新API了,请大家原谅我哈!

    不但英文不好,而且眼神也不好,尴尬,这是第一次,也是最后一次!

    我会在后面的文章中陆续把落下的补上,随着这几天的熟悉使用,有时帮我觉得它比selenium更出色,不知道是不是我的幻觉?


    __EOF__

  • 本文作者: 久曲健的测试窝
  • 本文链接: https://www.cnblogs.com/longronglang/p/17173611.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    android 完全退出应用程序
    Codewhisperer 使用评价
    idea mybatis-plus之MybatisX插件小知识(代码生成 哦)
    web课程设计网页规划与设计 :DW旅游主题网页设计——凤阳智慧旅游官方-地方旅游网站模板html源码HTML+CSS+JavaScript
    《优化接口设计的思路》系列:第七篇—接口限流策略
    Sentinel学习(1)——CAP理论,微服务中的雪崩问题,和Hystix的解决方案 & Sentinel的相关概念 + 下载运行
    宏集案例 | eX707G人机界面在石油钻井工程中的应用
    【继RNN之后的一项技术】Transfomer 学习笔记
    算法6 排序算法 QuickSort 快速排序
    设计模式面试问题总结
  • 原文地址:https://www.cnblogs.com/longronglang/p/17173611.html