Selenium ByChained、By.CssSelector、By.XPath、ByJQuery.ByJQuery

本文关键字:ByJQuery By ByChained XPath CssSelector Selenium | 更新日期: 2023-09-27 18:22:10

我在计算特定选择器时遇到问题。当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>

我创建了一个类,它应该处理这种风格的单选按钮和复选按钮(它提供容器、标签和输入的选择器。它还提供保存标签的文本。)

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.CsSelector:div[data form item property=MyDataGrouping].OpenQA.Senium.By]),By.XXP://输入])

显然,如果保证数字始终保持不变,我将使用输入元素的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:包含(我的组)输入

有什么想法吗?

Selenium ByChained、By.CssSelector、By.XPath、ByJQuery.ByJQuery

好吧,我在最后关于更改InputSelector的注释确实起到了作用。我忘了在选择器文本的末尾添加"input"。

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

然而,我仍然很好奇为什么我的第一个方法失败了。有什么想法吗?