是否可以将选择器文本添加到By对象

时间:2014-11-18 18:15:16

标签: selenium selenium-webdriver css-selectors

我想知道是否可以将选择器文本添加到现有的By对象。

也就是说,假设我有一个名为“.popup”的弹出窗口。但是随着webapp的使用,我想要更具体一点。现在,我们的弹出窗口增加了一个类名“.cart”。我的新选择器想成为“.popup.cart”。这就是我所拥有的。有没有更好或更有效的方法来做到这一点? (我用C#编码,但它可以与任何语言相关。)

By selector= By.CssSelector("div.popup");
selector = By.CssSelector(
    selector.ToString().Remove(0, selector.ToString().LastIndexOf(":") + 1) 
    + ".cart");

上面发生了什么,选择器成为“div.popup”。 selector.ToString()返回“By.CssSelector:div.popup” 所以我删除了从开头到最后一个“:”的所有文本,并将剩余的文本添加到“.cart”。 选择器然后变成“div.popup.cart”,这就是我想要的。

当我尝试组合任何已经被“ByChained”的选择器时,问题就出现了。 ToString()方法将返回By.Chained([By.CssSelector: .popup, By.CssSelector: .title])

如果有帮助,我也是嘶嘶声。所以,如果有一种JQuery方法可以做到这一点,我就是开放的。

2 个答案:

答案 0 :(得分:1)

将“div.popup”放在一个字符串中,如下所示:“str”: -

String str = div.popup

然后你可以将“.cart”附加到字符串中,使其成为“div.popup.cart”,然后使用 cssSelector

By selector= By.cssSelector(str+".cart");

注意: - 上面是一个java代码。

答案 1 :(得分:-1)

如上所述,我基本上通过展开By.CssSelector()。ToString()输出和/或ByChained()。ToString()输出来解决这个问题。有一些警告。主要是ByChained()中的最后一个选择器必须是By.CssSelector类型(因为我正在添加一个JQuery伪类):

private static By AddPseudoFunction(By selector, string pseudoFunc)
{
  string type = selector.GetType().ToString();
  string selectorValue = selector.ToString();

  if (type.Contains("Chained"))
  {
    selectorValue = selectorValue.Remove(0, selector.ToString().IndexOf("[") + 1);
    int start = selectorValue.LastIndexOf("]");
    int delta = selectorValue.Length - start;
    selectorValue = selectorValue.Remove(start, delta);
  }
  StringBuilder builder = new StringBuilder();
  foreach (string s in selectorValue.Split(','))
  {
    builder.Append(" ");
    builder.Append(s.ToString().Remove(0, s.ToString().LastIndexOf(":") + 2));
  }
  selectorValue = builder.ToString().TrimStart(' ') + pseudoFunc;

  return new ByJQuery.ByJQuerySelector(selectorValue, true);
}

当然,如果你想这样做它会返回一个By.CssSelector,只需用以下代码替换:

return By.CssSelector(selctorValue + addSelector); 

其中addSelector是一个有效的CSS Selector值(就像我在问题中描述的那样)。