是否可以使用C#

时间:2015-06-27 21:19:37

标签: c# selenium

tldr;这里的版本:我想从IWebElement中检索一个唯一的选择器,或者创建一个。这可能吗?

我有一个测试框架,我已经为各种元素创建了actor类,例如带有标签的输入框。这个课程被推广,以便一个人不需要创建一个新的"点击"每次遇到带标签的输入时的方法。

我的类在其属性中包含IWebDriver和一些By选择器。当然,当它需要采取行动时,它将两者结合成一个明智的命令。这是我班上的一个简单例子。

public class InputActorClass
{
    IWebDriver Driver {get; set;}
    By Input {get; set;}
    public InputActorClass(IWebDriver driver, By selector)
    {
        Driver = driver;
        Selector = selector;
    }
    public InputActorClass SelectCheckbox()
    {
        IWebElement actor = Driver.FindElement(Input);
        if (!actor.selected) { actor.click(); }
        return this;
    }
}

正如您所看到的,我只需要调用SelectCheckbox,并且该类已经知道具有By选择器对象和IWebDriver对象。

但是,我遇到过这样一种情况:我必须扫描输入元素列表才能找到具有正确文本的元素。但目前我能想到的唯一方法就是做到以下几点:

public void SelectOption(string value)
{
    By itemselectors = new ByChained(container, By.CssSelector("input"));
    foreach (IWebElement el in driver.FindElements(itemselectors))
    {
        if (el.text.Equals(value))
            actor = new InputActorClass(driver, el.???);
    }
    actor.SelectCheckbox();
    // and do other stuff that the InputActorClass may provide.
}

精明的读者可能会建议我使用XPath来创建我的选择器,而不是通过整个foreach循环。我的问题是这些特定的输入元素嵌套在各种动态创建的类别中,并且类别之间可能具有相同的名称。并且,由于它是动态创建的,因此我无法保证我所需的元素位于相同的nth-child()位置。

当然,我可能只需要分解并使用XPath来选择类别和输入元素。我希望有办法做我要问的事。

这里有一些html例如:

<body>
  <div class="checkbox">
    <div>
      <input type="checkbox"/>
      <label>My First Checkbox</label>
    </div>
    <div>
      <input type="checkbox"/>
      <label>My Second Checkbox</label>
    </div>
  </div>
</body>

这里有一些可能遍历html的C#代码:

CheckboxActorClass InputActor;
foreach (IWebElement el in driver.FindElements(By.CssSelector(".checkbox label")))
{
    if (el.Text.Equals(textToMatch))
    {
        By selector = el.GetUniqueSelector();  // this line is obviously not right.  What *is* the correct solution?
        InputActor = new CheckboxActorClass(driver, new ByChained(selector, By.XPath("/../input")));
        break;
    }
}
// Do stuff with the InputActor, like InputActor.Select();

0 个答案:

没有答案