如何用Selenium获取JavaScript中的属性数据

发表于:2022-7-01 09:29

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

 作者:后端之巅    来源:稀土掘金

  在执行Selenium测试自动化时,你会遇到许多需要验证WebElements属性和值的场景。例如,你可能需要在自动化测试代码中获得元素的文本值,然后根据所需的值进行验证。在Selenium中,getText()方法被用来获取Web元素的文本值。
  如果测试场景比较复杂,仅仅获取元素的文本值是不够的呢?在这种情况下,你需要使用WebElements的额外(和相关)属性。同样,我们可能会面临这样的情况:仅仅验证文本值对测试来说是不够的,我们需要获得DOM中静态或动态的元素的额外属性。无论是JavaScript还是其他Selenium支持的编程语言,获取WebElements的特定属性在Selenium自动化测试中是非常有用的。
  在这篇博客中,我们将深入探讨如何在JavaScript中获取数据属性,以构建一流的Selenium自动化测试场景。
  什么是HTML中的属性
  HTML中的属性通过提供关于HTML元素的额外信息发挥着重要作用。它也可以用来通过实现元素的事件来改变它们的行为。HTML中的属性通常使用名-值对来定义。
  名称是你想要设置的属性。例如,例子中的图像标签 元素带有一个属性,其名称是 src,表示图像的来源。
  值表示需要设置的相应属性的值。它总是用引号括起来。下面是这个例子,它显示了扩展名为.jpeg的图像的值。
  <img src='imagename.jpeg'/>
  属性名和属性值是不区分大小写的。然而,万维网联盟(W3C)推荐小写属性(或属性值),作为HTML 4建议的一部分。你可以查看我们之前的博客,它可以帮助你了解如何在Selenium WebDriver中获取属性值。
  自动化测试中常用的属性
  尽管HTML中有许多属性,但只有其中的一部分主要用于自动化测试。以下是HTML中的一些常用属性。
  ·id:id属性用于识别整个DOM中唯一的WebElements。
  · 类:类属性提供了一种对类似WebElements进行分类的方法。
  · 样式:style属性用于为WebElements添加CSS样式。
  · 标题:title属性用于提供元素的上下文信息。在几乎所有的网络浏览器中,元素的标题可以在鼠标悬停在窗口上时显示为工具提示。
  属性的主要类型
  下面列出了一些属性的主要类别(或类型)。
  · 必备属性。这些属性不能从HTML标签中省略。例如,如果没有的src,页面上就不会显示图像。
  · 可选属性。这些属性应该被添加,以赋予元素更多的意义。例如,的title为图像提供了一个标题,但它不是一个强制性的属性。
  · 事件属性。这些属性是基于用户操作而触发的事件。例如 - 任何html元素上的onmouseover事件都是在用户将鼠标指针悬停在该特定WebElement上时触发的。
  · 标准属性。这些也被称为全局属性。这类属性几乎可以在所有的HTML标签中使用(如id、class、style等)。
  HTML中的属性在Selenium自动化测试中发挥着越来越重要的作用。现在我们已经介绍了HTML中的属性的基本知识,让我们看看如何在Selenium JavaScript中获得属性数据的基本方面。
  为什么属性对自动化测试很重要
  属性可以改变WebElements的行为,这取决于用于执行自动化测试的场景(或事件)。让我们来看看公共汽车预订应用程序的例子。在这里,预订的座位通常用 "灰色 "表示,而 "绿色 "表示座位可供预订。如果颜色的表述有误,客户在订票时就会面临问题。顾客会失去对品牌的信任,这反过来会妨碍公司的收入。
  因此,测试已订票和可用票是否以正确的颜色编码表示变得极为关键。
  手动测试不是首选,因为它不是一个可扩展和可靠的方法。然而,这种情况可以通过在Selenium JavaScript中获取属性数据来测试。因此,在构建到生产环境之前,这是一个理想的测试方法。
  如何在Selenium JavaScript测试中获取属性数据
  Selenium是一个流行的网络自动化测试工具,因为它有大量的开源社区支持,并且容易用你选择的编程语言编写测试。此外,Selenium自动化框架被广泛用于跨浏览器兼容性测试,确保网站(或网络应用)在不同的浏览器、平台和设备组合中统一运行。
  使用Selenium和JavaScript,你可以得到网站(或网络应用)上当前状态下显示的HTML元素的属性数据。此外,一旦WebElements的属性(如颜色、锚标签的链接更新等)发生事件变化,你也可以验证属性的变化数据。
  Selenium中的getAttribute()
  Selenium的getAttribute()方法是用来获取被测试的HTML元素的属性。这个方法是WebElement类的一部分。getAttribute()方法可用于获取不同属性的值,如class、name、src、CSS样式值等。
  更确切地说,如果该属性存在,这个Selenium方法会返回给定属性的数据,否则会返回null。例如,getAttribute()方法可以用来获取textarea元素的 "value "属性。style "属性被转换为带有尾部分号的文本表示。
  语法
  var ele = driver.findElement(By.id('#'));
  var attribute_value= ele.getAttribute('attribute_name'); // returns the attribute value
  示范--如何在Selenium JavaScript中获取属性的数据
  在我们演示如何使用JavaScript在Selenium中获取属性数据之前,必须为Selenium测试自动化准备好基本设置。你可以参考我们之前的博客,题为《用Selenium JavaScript进行自动化测试》,以建立一个用JavaScript绑定在Selenium中编写测试的环境。
  另外,你也可以查看LambdaTest YouTube频道的视频,指导你完成Selenium JavaScript之旅。
  考虑一个在线销售不同类型钢笔的示例应用程序。这就是我们计划实现的,作为演示如何使用Selenium和JavaScript获得属性数据的一部分。
  测试场景
  两个场景将使用Selenium和JavaScript进行自动化测试。首先,我们获取页面上相关属性的数据。
  验证当用户试图悬停在过滤器部分显示的颜色样本上时,产品的颜色是否与显示给用户的颜色相同。
  验证用户看到的产品名称是否正确,因为它是从后端获取的。
  实施
  测试是在LambdaTest的基于云的Selenium Grid上运行。基于云的网格的优势在于,Selenium测试自动化可以在一系列的浏览器、平台和设备组合中大规模地进行。
  你可以在Selenium中执行并行测试,以利用LambdaTest Grid提供的速度和规模优势。一旦你在LambdaTest上创建了一个账户,请记下LambdaTest配置文件部分的用户名和访问密钥。
  使用LambdaTest能力生成器来生成所需的浏览器能力,Selenium测试自动化必须针对这些能力进行。将环境变量LT_user和LT_token分别设置为LambdaTest用户名和访问密钥。
  require('dotenv').config();
  exports.config = {
    LT_user:  process.env.LT_user, // Your LambdaTest username
    LT_pass:process.env.LT_token, // Your LambdaTest token
    capabilities: {
    'build':  'Mocha-Selenium-Sample', //Build name
    'name':  'Test sample for getAttribute()', // Test name
    'platform':  'Windows 10', // OS name
    'browserName':  'chrome', // Browser name
    'version':  'latest', // Browser version
    'visual':  true, // To take step by step screenshot
    'network':  true, // To capture network Logs
    'console':  true, // To capture console logs.
    }
  }
  为了演示,我们使用Selenium 4(Beta 2)版本的Selenium WebDriver。要了解更多关于Selenium 4的信息,请查看LambdaTest学习中心的Selenium 4。
  {
    "name": "lambdatest",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
      "test": "mocha --recursive --timeout 300000 ./tests/tests.js"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "dependencies": {
      "chromedriver": "^89.0.0",
      "dotenv": "^8.2.0",
      "mocha": "^8.3.2",
      "selenium-webdriver": "^4.0.0-beta.2"
    }
  }
  require('chromedriver');
  const assert = require('assert');
  const { Builder, By } = require('selenium-webdriver');
  const { config } = require('../conf/conf.js');
  const conf=require("../conf/conf.js").config;
  const USERNAME = conf.LT_user
  const KEY = conf.LT_pass;
  const GRID_HOST = 'hub.lambdatest.com/wd/hub';
   
  describe('Check Colours in filter section', function () {
      let driver;
   
      before(async function () {
          let caps=conf.capabilities;
          let gridUrl='https://' + USERNAME + ':' + KEY + '@' + GRID_HOST;
          console.log(gridUrl)
          driver = await new Builder().usingServer(gridUrl).withCapabilities(caps).build();
          await driver.get('https://www.pens.com/ie/c/pens-writing');
      
      });
   
      it('Verify the colour matches the swatch title', async function () {
          
          let list = await driver.findElements(By.css("a[class='colour-swatch ']"));
          let colour=[];
          for (item of list) {
              //Using getAttribute to get the data
              let col = await item.getAttribute("title");
              colour.push(col)
          }
          console.log(colour)
   
      });
   
      it('Check the Product name matches with data attribute', async function(){ 
          let product_data_attribute = await driver.findElement(By.id('product-card-1'));
          let product_name_displayed = await driver.findElement(By.className('product-card__name'));
          console.table([await product_data_attribute.getAttribute('data-prod-name') , await product_name_displayed.getText()])
   
      });
   
      after(() => driver && driver.quit());
  })
  代码演练
  第一步:
  在conf.js中声明的浏览器功能被用于测试实现。该测试将在Windows 10平台上的Chrome 89.0上运行。执行Selenium网络自动化的LambdaTest网格被设置为hub.lambdatest.com/wd/hub。
  let caps=conf.capabilities;
  let gridUrl='https://' + USERNAME +':' + KEY +'@' + GRID_HOST;
  第二步:
  Selenium WebDriver的get方法被用来设置测试URL。
  await driver.get('www.pens.com/ie/c/pens-w…');
  第三步:
  Selenium中的findElements方法用于使用CSS选择器属性来定位WebElements。你可以查看我们的博客,了解专业测试人员如何利用CSS选择器实现Selenium Web自动化。
  let list = await driver.findElements(By.css("a[class='colour-swatch ']"));
  Chrome浏览器中的检查工具被用来定位WebElements。
  第四步
  浏览整个列表,获取每个元素的 "标题 "属性。
  for (item of list) {
   //Using getAttribute to get the data
   let col = await item.getAttribute("title");
   colour.push(col)
  }
  如下图所示,列表中相应元素的标题是白色。按照类似的思路,你会为列表中的元素设置黑色、浅蓝色、蓝色等标题。
  第五步:
  在 "检查产品名称与数据属性是否匹配 "的函数中,我们首先使用ID属性定位WebElement(即product-card-1)。
  let product_data_attribute = await driver.findElement(By.id('product-card-1'));
  第六步:
  使用Selenium的className属性,我们找到WebElement product-card__name
  let product_name_displayed = await driver.findElement(By.className('product-card__name'));
  下面是我们如何使用Chrome中的检查工具(或Chrome DevTools)定位WebElement的。
  第七步:
  JavaScript中的console.table函数用于以表格的形式显示数据。Selenium中的getAttribute方法被用来获取每个项目的data-prod-name属性。
  console.table([await product_data_attribute.getAttribute('data-prod-name') , await product_name_displayed.getText()])
  下面是Chrome浏览器中的检查工具是如何用来获取相应属性的细节的。
  执行输出
  在终端上触发以下命令,运行演示如何使用JavaScript在Selenium中获取属性数据的例子。
  npm test
  下面是终端的执行快照和LambdaTest自动化仪表板,表明测试执行成功。
  就这样了,伙计们
  在这篇博客中,我们学习了如何使用JavaScript和Selenium读取(或获取)属性数据。这可以用在Selenium网页自动化场景中,你必须读取页面上的属性值。
  Selenium中的getAttribute()方法是用来读取相应属性的值的。我们还在LambdaTest提供的Selenium网格云中实现了getAttribute(),并在Windows 10上安装的Chrome浏览器中进行了测试。因此,可以使用LambdaTest这样基于云的Selenium网格来进行大规模的浏览器兼容性测试。此外,它可以让你在2000多个浏览器和操作系统上在线运行自动化测试。
  最好是利用基于云的Selenium网格提供的优势,这样你就能以更有效的方式获得Selenium JavaScript中的属性数据。
  祝你使用Selenium和JavaScript测试愉快!
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号