使用Selenium

时间:2017-11-10 13:25:27

标签: c# selenium selenium-webdriver

我正在为一个非常动态的网站编写测试,在这个网站上,可以按任意顺序在画布上添加和删除对象,并且这些对象的次数不确定。对于当前测试,我需要跟踪特定类型的多个对象,然后按特定顺序操作它们。

为了让我作为测试人员的生活更轻松,开发人员将test-id添加到所有对象,并指定它是什么类型的对象。 为了跟踪画布上的特定对象,我需要获取ID,因为它们对于每个对象都是唯一的。因此,我想对当前测试做的是获取特定类型的所有对象的列表 - 使用test-id,然后检索每个对象的ID。每个对象的结构如下所示:

<div test-id="object-type1" id="ember935" class=...>
  <div class="ObjectHeader">
    <ul>
      <li>...</li>
      <li>...</li>
    </ul>
  </div>
</div>

所以,只需使用

获取所有元素
Driver.FindElements(By.CssSelector("*[test-id=object-type1]");

返回一个列表,其中包含我正在寻找的所有IWebElements。我的问题是我找不到从这些元素中读取id的方法,我只能看到下面的节点。我也可以创建一个包含所有ID的列表,但是我不能通过查看test-id来过滤它们。

通过比较不同的列表或类似的东西,有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:0)

要阅读并打印 id ,您可以使用以下代码块:

IList<IWebElement> elements = Driver.FindElements(By.CssSelector("*[test-id=object-type1]");
foreach (IWebElement element in elements) 
{
    string my_id = element.GetAttribute("id");
     Console.WriteLine(my_id);
}

答案 1 :(得分:0)

我知道你已经接受了一个答案,但是我会把它包装成一个函数,因为你将要使用它很多。该函数将test-id作为参数,并返回test-id指定的元素的ID集合。

BTW,在这种情况下,不需要CSS选择器中的*。

/// <summary>
/// Returns a list of IDs that correspond to the elements of type test-id
/// </summary>
/// <param name="testId">The test-id that the elements should contain</param>
/// <returns>A list of IDs</returns>
public List<string> GetIdsByTestId(string testId)
{
    return Driver.FindElements(By.CssSelector($"[test-id={testId}]")).Select(e => e.GetAttribute("id")).ToList();
}