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();