如何在Selenium WebDriver中通过文本查找元素

发表于:2023-1-05 10:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:迪鲁宾    来源:掘金

  在Selenium中通过文本查找元素是使用其文本属性来定位一个网络元素。当基本的元素识别属性(如ID或Class)是动态的,使其难以定位网络元素时,大多会使用文本值。
  有时,开发者倾向于将具有相同ID或相同Class的类似Web元素组合在一起。例如,如果你有一个标签为Button的元素,它有一个动态的ID和Class名称,其中ID从 "ID-3465-text1 "变为 "ID-4434-textE2",而Class名称在每个新会话中从 "ID-Class-text45 "变为 "ID-Class-text73"。
  来源
  在这种情况下,使用ID或Class属性来定位网络元素变得非常困难,这时Text属性在执行Selenium自动化测试时就会发挥作用。
  文本值可以完全匹配或部分匹配来定位元素。在这篇关于如何在Selenium WebDriver中通过文本查找元素的文章中,你将了解到如何使用Text属性来查找任何元素。
  让我们开始吧!
  什么是Selenium中的查找元素?
  当你开始写你的Selenium自动化脚本时,与网络元素的交互成为你的第一步,也是非常重要的一步,因为你在测试脚本中玩的是WebElements。现在,只有当你用正确的方法来识别这些网络元素时,与它们的互动才能发生。
  Selenium中的查找元素方法是一个帮助你识别网络元素的命令。查找元素有多种方法,可以使用Selenium中的Web定位器(如ID、Name、Class Name等)在网页中唯一地识别一个Web元素。下面是Selenium中查找元素的语法。
  查找元素的语法是
  WebElement elementName= driver.findElement(By.<LocatorStrategy>("LocatorValue"));
  如上面的语法所示,该命令接受 "By"对象作为参数并返回一个WebElement对象。By"是一个定位器或查询对象,接受定位器策略。定位器策略可以有以下几种值。
  ·ID
  · 名称
  · 类别名称
  · 标签名称
  · 链接文本
  · 部分链接文本
  · XPath
  · CSS选择器
  什么是Selenium中通过文本查找元素?
  我们在上一节中看到了Selenium中的查找元素和它的语法。现在,你一定想知道如何在Selenium WebDriver中通过文本查找元素。
  答案是通过使用Selenium中的XPath!
  想知道怎么做吗?让我们看看下面的部分。
  为了使用文本,你需要使用XPath作为你的定位策略,并在定位值中使用元素的文本属性。
  Selenium中XPath的基本格式如下。
  XPath = //tagname[@Attribute=’Value’]
  然而,在我们开始之前,有必要了解Selenium的两个内置方法,这两个方法最终将用于findElement。
  1.text() - 这是Selenium的一个内置方法,与XPath一起使用,以便根据一个元素的确切文本值来定位它。在findElement中使用text()的语法是。
  WebElement ele = driver.findElement(By.xpath(“//<tagName>[text()=’text value’]”))
  2.contains()- 与text()方法类似,contains()是另一个内置方法,与XPath一起使用。然而,这是在我们想根据部分文本匹配来写定位器时使用的。在 findElement 中使用 text() 和 contains() 的语法是。
  WebElement ele=driver.findElement(By.xpath(“//<tagName>[contains(text(),’textvalue’)]”))
  现在让我们详细了解一下这些。
  在Selenium中通过文本查找元素,用于完整的文本匹配
  现在,你已经看到了在完全文本匹配的情况下使用text()的语法。在这一节中,关于如何在Selenium中通过文本查找元素,让我们通过一个例子来看看。
  我们将使用LambdaTest提供的Selenium Playground来理解这一点。LambdaTest是一个基于云的跨浏览器测试平台,支持Selenium网格,为你使用本地机器进行自动化测试时面临的每一个障碍提供解决方案。像LambdaTest这样的测试自动化平台提供了一个由3000多个在线浏览器组成的Selenium网格,让你毫不费力地执行Selenium自动化测试。
  使用案例
  1. 登录到Selenium Playground。
  2. 使用text()方法识别上述网页上的Checkbox Demo链接的Web元素。
  3. 点击它并打印页面标题。
  实施
  我们将使用Java的Selenium实现该案例,并使用LambdaTest提供的云Selenium网格来执行我们的测试案例。
  Selenium网格是指一种软件测试设置,它使质量保证人员能够在多个浏览器和具有独特操作系统的设备上执行并行测试。当Selenium Grid的整个设置可以使用基于云的服务器访问时,它被称为Selenium Grid Cloud。一个在线的Selenium Grid帮助你专注于编写更好的Selenium测试脚本,而不是担心基础设施的维护。
  现在让我们来检查一下复选框演示页面的定位器。为了检查,你可以简单地右键点击网络元素,然后点击检查。在元素标签上,你可以开始编写你的定位器。
  如上图所示,我们使用Checkbox Demo文本与它的标签a进行完全匹配,因此,这里的正确实现将是。
  WebElement checkbox= driver.findElement(By.xpath(“//a[text()=’Checkbox Demo’]”))
  现在让我们使用同样的方法,写出我们的测试案例。
  你可以参考下面的测试案例。
  package LambdaTest;
   
      import org.openqa.Selenium.By;
      import org.openqa.Selenium.WebElement;
      import org.openqa.Selenium.remote.DesiredCapabilities;
      import org.openqa.Selenium.remote.RemoteWebDriver;
      import org.testng.Assert;
      import org.testng.annotations.AfterTest;
      import org.testng.annotations.BeforeTest;
      import org.testng.annotations.Listeners;
      import org.testng.annotations.Test;
   
      import java.net.MalformedURLException;
      import java.net.URL;
      import java.util.List;
   
      @Listeners({util.Listener.class})
      class AutomationUsingFindElementByText {
   
          public String username = "YOUR USERNAME";
          public String accesskey = "YOUR ACCESSKEY";
          public static RemoteWebDriver driver = null;
          public String gridURL = "@hub.lambdatest.com/wd/hub";
   
          @BeforeTest
          public void setUp() throws Exception {
             DesiredCapabilities capabilities = new DesiredCapabilities();
              capabilities.setCapability("browserName", "chrome");
              capabilities.setCapability("version", "96.0");
              capabilities.setCapability("platform", "win10"); // If this cap isn't specified, it will just get the any available one
              capabilities.setCapability("build", "AutomationUsingFindElement");
              capabilities.setCapability("name", "AutomationUsingFindElementSuite");
              try {
                  driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + gridURL), capabilities);
              } catch (MalformedURLException e) {
                  System.out.println("Invalid grid URL");
              } catch (Exception e) {
                  System.out.println(e.getMessage());
              }
          }
   
   
   
          @Test
          public void findElementByCompleteTextMatch() {
              try {
                  System.out.println("Logging into Lambda Test Selenium Playground");
                  driver.get("http://labs.lambdatest.com/Selenium-playground/");
   
                  WebElement checkBoxDemoPage= driver.findElement(By.xpath("//a[text()='Checkbox Demo']"));
                  checkBoxDemoPage.click();
                  System.out.println("Clicked on the Checkbox Demo Page");
   
                  WebElement header=driver.findElement(By.xpath("//h1"));
                  System.out.println("The header of the page is:"+header.getText());
              } catch (Exception e) {
   
              }
   
          }
   
   
          @AfterTest
          public void closeBrowser() {
              driver.close();
              System.out.println("The driver has been closed.");
   
          }
   
      }
  你可以使用下面的testng.xml文件来运行上述测试案例。
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
  <suite  name="AutomationUsingFindElementSuite">
   
      <test name="AutomationUsingFindElementTest" >
          <classes>
              <class name="LambdaTest.AutomationUsingFindElementByText" >
              </class>
          </classes>
      </test>
  </suite>
  下面的pom.xml文件用于安装所有必要的依赖项。
  <?xml version="1.0" encoding="UTF-8"?>
  <project xmlns="http://maven.apache.org/POM/4.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
   
      <groupId>org.example</groupId>
      <artifactId>LambdaTest</artifactId>
      <version>1.0-SNAPSHOT</version>
      <dependencies>
          <dependency>
              <groupId>org.Seleniumhq.Selenium</groupId>
              <artifactId>Selenium-api</artifactId>
              <version>4.0.0-alpha-7</version>
          </dependency>
          <dependency>
              <groupId>org.Seleniumhq.Selenium</groupId>
              <artifactId>Selenium-remote-driver</artifactId>
              <version>4.0.0-alpha-7</version>
          </dependency>
          <dependency>
              <groupId>org.Seleniumhq.Selenium</groupId>
              <artifactId>Selenium-chrome-driver</artifactId>
              <version>4.0.0-alpha-7</version>
          </dependency>
          <dependency>
              <groupId>org.testng</groupId>
              <artifactId>testng</artifactId>
              <version>6.14.3</version>
          </dependency>
          <dependency>
              <groupId>io.github.bonigarcia</groupId>
              <artifactId>webdrivermanager</artifactId>
              <version>4.4.3</version>
          </dependency>
      </dependencies>
   
      <properties>
          <maven.compiler.source>8</maven.compiler.source>
          <maven.compiler.target>8</maven.compiler.target>
      </properties>
   
  </project>
  代码演练
  在这个关于如何在Selenium中通过文本查找元素的部分,让我们详细看看代码的不同区域。
  1. 导入的依赖性。在这里,我们已经导入了Selenium WebDriver、WebDriverWait、Desired Capabilities和RemoteWebDriver的所有必要的类,以设置各自的浏览器能力并在网格上运行测试案例。
  2. 全局变量。由于我们使用了像LambdaTest这样的Selenium网格云来执行我们的测试,我们使用了下面的变量。
  在这里,你可以填入相应的用户名和访问密钥的值,这些值可以通过登录LambdaTest配置文件部分收集。你可以复制用户名和访问令牌,以便在代码中使用。然而,网格的URL将保持不变,如下图所示。
  我们在这里也使用了监听器类,以便定制TestNG报告。TestNG为我们提供了很多监听器(例如,IAnnotationTransformer,IReporter等)。这些接口在执行Selenium自动化测试时主要用于生成日志和定制TestNG报告。
  为了实现监听器类,你可以简单地在你的测试类中添加一个注解,就在你的类名上面。
  语法。
  @Listeners(PackageName.ClassName.class)
  3. @BeforeTest(设置方法)。在这里,我们使用了LambdaTest DesiredCapabilities Generator,并为我们的Selenium Remote WebDriver设置了浏览器名称、版本、平台等必要的能力。之后,我们在启动的浏览器中打开网站。
  4. @Test(findElementByCompleteTextMatch)。在这种情况下,我们首先登录到Selenium Playground的网页。之后,我们使用完整的文本匹配找到Checkbox Demo按钮,并点击该按钮。最后,我们要打印网页的标题。
  5. @AfterTest(closeBrowser)。这里,我们只是关闭启动的浏览器。
  一旦测试完成,你也可以在LambdaTest自动化仪表板上查看你的测试结果、日志和测试记录
  控制台输出
  一旦你运行了测试用例,控制台的输出将看起来像下面这样。
  下面的视频将帮助你通过与不同的网络元素互动,在Selenium中使用Java编写你的第一个测试脚本。
  你也可以订阅LambdaTest YouTube频道,随时了解围绕Selenium测试、Cypress E2E测试、CI/CD等的最新教程。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号