如何在selenium中单击自定义属性?

时间:2017-05-17 20:34:31

标签: javascript selenium xpath nodes

我有以下html: 它有一个类和一个自定义属性,我有几个具有相同className的标题。我想知道如何唯一地获取此元素并单击它。

<h4 class="font-white topic-heading progress-header no-margin width-80 d-table-cell" data-collapse-id="1">I. Introduction</h4>

这是我试过的: -

我试图获得class =&#34; font-white ...&#34;的属性。 with data-collapse-id =&#34; 1&#34; :

var element = driver.findElement(By.xpath("//*[@class='font-white topic-heading progress-header no-margin width-80 d-table-cell']")).getAttribute('data-collapse-id="1"');
console.log(element); // this prints a promise.

element.click(); //element.click is not a function exception 

我也尝试过: -

var element = driver.findElement(By.xpath("//*[@data-collapse-id='1']"));

element.click(); // element.click is not a function exception.

我想知道如何在selenium中获取此元素并单击它。

这是整个div:

<div class="page-width d-table topic-heading-div">
   <h4 class="font-white topic-heading progress-header no-margin width-80 d-table-cell" data-collapse-id="1">I. Introduction</h4>
   <i class="fa fa-check font-white font-18 width-20 d-table-cell text-center vertical-center" aria-hidden="true"></i>
</div>

3 个答案:

答案 0 :(得分:1)

你有没有尝试过:

driver.findElement(By.cssSelector("h4[data-collapse-id='1']")).click();

通过此属性查找元素应该有效,因为这是唯一的。此外,它有时无法单击xpath找到的元素。我认为这应该有用

答案 1 :(得分:0)

您的element变量似乎打算返回attribute。但是,getAttribute()方法应该接收属性名称值作为参数并返回一个属性值,这是一个简单的字符串......在这里你几乎没有问题:

  • 您试图传递错误的参数:'data-collapse-id="1"'而不是'data-collapse-id'
  • 属性值,一个字符串,不可点击!

简单回答您的问题 - 您无法点击自定义属性

答案 2 :(得分:0)

Class用于定义一组具有相似特征的元素。在这种情况下,topic-heading类用于将<h4>标记与称为data-collapse-id的唯一ID属性一起分组。但在这种情况下,我们无法使用ID来识别/指定每个Web元素,因为同一类的元素可以是数百/数千。

您可以尝试使用以下方式唯一地找到任何标头元素:

var exactHeadingText = "I. Introduction"; // Exact heading
By locExactTopicHeading = By.xpath("//h4[contains(@class,'topic-heading') and text()='"+ exactHeadingText + "']");

var partialHeadingText = "Introduction"; // Partial heading
By locPartialTopicHeading = By.xpath("//h4[contains(@class,'topic-heading') and contains(text(),'"+ partialHeadingText + "')]");

理想情况下,您应该将exactHeadingText/partialHeadingText作为函数参数/参数传递,以便可以重用代码来获取任何主题标题。

然后,您可以使用findElement()并对其执行任何操作。