【问题标题】:Why does Selenium inserts a backslash before the Hyphen character?为什么 Selenium 在连字符之前插入反斜杠?
【发布时间】:2019-08-25 10:01:30
【问题描述】:

以下代码在 IEFirefox 中失败。 Chrome 从来没有遇到过问题。

foundElement = driver.FindElement(By.Id("btn-GDR"));

它说找不到元素#btn\-GDR

为什么 Selenium- 之前插入 \

Firefox 65.0.2 版本 IE 11.0.9600.19301

编辑:更多信息:我尝试过使用

"btn\x2dGDR" 表示 \x2d 是“-”符号(十六进制中的 ASCII),但它不能解决问题。它总是在它前面插入一个“\”。

【问题讨论】:

  • 这是 css 规范化的一部分,所有特殊字符都将附加 `\`。您正在使用哪个语言库。我没有看到 python 的那个问题。
  • 哈哈,我需要放两个反斜杠才能在评论中显示`\`。标准化...
  • 为您使用的语言添加标签... Java?插入斜线以转义连字符。您是否尝试过添加等待?你还做了什么来调查这个问题?
  • 我正在使用 C#。只要我知道如果你想写一个 \\ 你必须用另一个 \\ 但不是 - 来逃避。我只有 IE 和 Firefox WebDriver 的问题。

标签: regex selenium selenium-webdriver css-selectors webdriver


【解决方案1】:

由于Selenium 将不同的Locator Strategies 转换为有效的CSS 选择器,根据switch - cases 类名id em>、nametag name等通过:

转换
cssEscape(value);

cssEscape(value) 定义为:

private String cssEscape(String using) {
  using = using.replaceAll("([\\s'\"\\\\#.:;,!?+<>=~*^$|%&@`{}\\-\\/\\[\\]\\(\\)])", "\\\\$1");
  if (using.length() > 0 && Character.isDigit(using.charAt(0))) {
    using = "\\" + Integer.toString(30 + Integer.parseInt(using.substring(0,1))) + " " + using.substring(1);
  }
  return using;
}

因此您会看到 - 字符被 \ 字符转义

【讨论】:

  • 我不太了解该方法,但可以肯定的是 Chrome 不会发生这种情况。只是为了标记为有效,我需要知道这一点。除此之外,除了要求开发人员从 ID 中删除“-”之外,我还没有找到任何其他解决方案。
  • IEFirefox 遵循 W3C 方言,而 Chrome 遵循 OSS 方言。你的问题和这个答案是基于 IEFirefox 的,因为 Chrome / ChromeDriver 可能会以不同的方式处理它。
  • 很抱歉我的问题不是 100% 正确。我试图找到的 id 是“btn-GDR”,而 selenium 说它找不到“btn\-GDR”,在 DASH 之前只有一个 BACKSLASH。我将添加更多信息。
  • 更新:我发现它在没有 cssEscape() 或任何东西的情况下在 FF 中工作。我正在分析一个奇怪的情况。我有 15 个应用程序,每一个都可以通过按钮访问。我检查了 id 的按钮没有重复。当我与一个可见 3 个按钮的用户一起进入时(由于他的访问控制),它起作用了!我的用户能够访问 15 个应用程序,但它没有.. 所以这可能是我的应用程序或其他什么的错误.. 一旦我确定错误,我会及时更新帖子。
  • 我在找到元素之前解决了这个问题 WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.PresenceOfAllElementsLocatedBy(By.Id(locator)));事实证明,有时元素在某些奇怪的情况下不存在。我可以在屏幕上看到它,但硒需要 2-3 秒才能看到它。并且奇怪地将 \- 添加到输出消息中。
【解决方案2】:

我将回答我自己的问题,因为我已经找到了解决方案。 我在找到元素之前添加了一个等待。

    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
    wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.
    PresenceOfAllElementsLocatedBy(By.Id("btn-GDR")));

事实证明,有时由于某种奇怪的原因该元素不存在。我可以在屏幕上看到它,但 Selenium 需要 2-3 秒才能正确地与之交互。是的,该元素始终可见、已启用并且确实会退出。此外,当 Selenium 报告选项时,在输出消息的连字符前添加反斜杠。

仅供参考,我在这里发现了同样的情况。没有人回答。 Similar Problem

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多