Selenium ByChained,By.CssSelector,By.XPath,ByJQuery.ByJQuerySelector不按照我希望它工作的方式工作

时间:2014-09-17 17:57:06

标签: c# jquery selenium-webdriver css-selectors

我在设计特定的选择器时遇到了麻烦。我的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而不会失败。但是,它与Inp​​utSelector有问题。 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)输入            

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好的,我最后关于更改InputSelector的说明确实有效。我忘了在选择器文本的末尾添加“输入”。

public By InputSelector 
{
  get
  {
    return new ByChained(
      ItemsContainer, 
      new ByJQuery.ByJQuerySelector(".radio:contains('"+LabelText+"') input",true)); 
  } 
}

但是,我仍然很想知道为什么我的第一种方法失败了。有什么想法吗?