我在设计特定的选择器时遇到了麻烦。我的NUnit测试在到达我的选择器时会一直失败。我正在寻求帮助,试图做到这一点。以示例为例。
给出以下HTML代码:
<div class="form-item required row" data-form-item-property="MyDataGrouping" data-form-item-id="view1_MyDataGrouping">
<label class="form-label span2" for="view1_MyDataGrouping">
<div class="form-value span3">
<div class="radio">
<input id="undefined" type="radio" data-property="MyDataGrouping" checked="checked" value="1" name="view1_MyDataGrouping">
<label title="My Groups">My Groups</label>
</div>
<div class="radio">
<input id="undefined" type="radio" data-property="MyDataGrouping" value="2" name="view1_MyDataGrouping">
<label title="Default Groups">Default Groups</label>
</div>
</div>
</div>
我创建了一个应该处理这种radiobutton和checkbutton样式的类(它提供了容器,标签和输入的选择器。它还提供了标签的文本。)
class RadioButton {
public By ItemsContainer { get; set; }
public By InputSelector
{
get
{
return new ByChained( LabelSelector, By.XPath("/../input"));
}
}
public By LabelSelector
{
get
{
// put the single tick marks in to prevent an error with a null LabelText
return new ByChained( ItemsContainer,
new ByJQuery.ByJQuerySelector("label:contains('" + LabelText + "')", true));
}
}
public String LabelText { get; set; }
public RadioButton( By itemsContainer, string labelText )
{
ItemsContainer = itemsContainer;
LabelText = labelText;
}
[Test]
public void TestRadioButton()
{
IWebDriver driver = new FirefoxDriver();
RadioButton myRadio = new RadioButton(
By.CssSelector("div[data-form-item-property=MyDataGrouping]");
// The following two lines work
driver.FindElement(myRadio.ItemsContainer).Click();
driver.FindElement(myRadio.LabelSelector).Click();
// The next line does not work
driver.FindElement(myRadio.InputSelector).Click();
}
我已经确认Selenium可以找到ItemsContainer选择器和LabelSelector而不会失败。但是,它与InputSelector有问题。 LabelText设置为“我的组”NUnit返回以下内容:
OpenQA.Selenium.NoSuchElementException:找不到元素 使用By.Chained([By.Chained.CssSelector: DIV [数据形式项属性= MyDataGrouping] .OpenQA.Selenium.By]),By.XPath: /../输入])
显然,如果保证数字始终保持不变,我会使用input元素的value属性。但我不是。所以,我需要首先识别标签,然后XPath选择输入(因为我必须返回树上)。
进一步的尝试导致我将InputSelector的getter更改为:
public By InputSelector { get { return new ByChained(ItemsContainer, new ByJQuery.ByJQuerySelector(".radio:contains('"+LabelText+"')",true)); } }
虽然这没有失败,但它也没有像我预期的那样点击输入元素。
有效的SeIDE功能。 点击 css = div [data-form-item-property = MyDataGrouping] div.radio:contains(My Groups)输入
有什么想法吗?
答案 0 :(得分:0)
好的,我最后关于更改InputSelector的说明确实有效。我忘了在选择器文本的末尾添加“输入”。
public By InputSelector
{
get
{
return new ByChained(
ItemsContainer,
new ByJQuery.ByJQuerySelector(".radio:contains('"+LabelText+"') input",true));
}
}
但是,我仍然很想知道为什么我的第一种方法失败了。有什么想法吗?