【问题标题】:How to convert Selenium By object to a CSS selector?如何将 Selenium By 对象转换为 CSS 选择器?
【发布时间】:2017-08-04 23:49:27
【问题描述】:

在 selenium webdriver 中使用By 定位对象是很常见的。我目前正在使用 ByChained 选择器,我想知道有没有办法将 By 对象转换为 CSS 选择器?例如:

By selector = By.id('something');
String cssSelector = selector.toCSSselector();
// now cssSelector = "#something"

【问题讨论】:

  • 您尝试实现的目标可以使用monkeypatching 来完成,但是我不确定在java 中是否可行。在python中很容易。但是,如果您可以使用从 id 或 xpath 返回 CSS 选择器的方法创建一个不同的类。那不行吗?
  • 会的,但也会有更复杂的情况,比如 ByChained 等,不是那么容易写的
  • 当使用ByChained 时,文档让您看起来可以使用不同的选择器。所以我的问题是,为什么需要从一个 By 转换为另一个?类似ByChained(By.id("someId"),By.cssSelector("#some .cssSelector"))
  • ByChained 表示只取第一个By,然后在其子节点上找到下一个,依此类推。我需要来自By 的 CSS 选择器,因为我正在编写一个应用程序,它在 selenium 和我的测试应用程序之间放置代理并注入侦听特定事件的 js(我需要 CSS 选择器 - 这样我才能检测到事件) ,从而记录测试用例。

标签: css selenium selenium-webdriver css-selectors browser-automation


【解决方案1】:

据我所知,没有办法通过代码将一种定位器类型转换为另一种定位器类型。

您可以编写任何定位器(除了一些 XPath,例如包含文本)作为 CSS 选择器。只需将它们全部编写为 CSS 选择器,就可以解决您的问题。例如,您的 id 可以使用 CSS 选择器“#something”定位。如果您需要OR,只需在 CSS 选择器中添加一个逗号,例如“#someId, #some .cssSelector”是 mrfreester 评论中的示例。如果您必须对包含的文本使用 XPath,还有一种方法可以指定 ORthere。

【讨论】:

  • "您可以编写任何定位器(除了一些 XPath,例如包含文本)作为 CSS 选择器。"这正是我认为可以将 By 对象转换为 css 选择器的原因。问题是,我必须为已经存在的应用程序创建一个记录在 JS 中的应用程序,该应用程序已经使用了不同的 By 对象,而不仅仅是 By.cssSelector
【解决方案2】:

这是一个 hack,但它可以工作(在大多数情况下)。因此,如果您确实需要,可以使用以下方法:

    public String convertToCssSelectorString(By by) {
        String byString = by.toString();
        if (byString.startsWith("By.id: ")) {
            return "#" + byString.replaceFirst("By\\.id: ", "");
        } else if (byString.startsWith("By.className: ")) {
            return "." + byString.replaceFirst("By\\.className: ", "");
        } else if (byString.startsWith("By.cssSelector: ")) {
            return byString.replaceFirst("By\\.cssSelector: ", "");
        } else {
            throw new RuntimeException("Unsupported selector type: " + byString);
        }
    }

它并未涵盖所有可能的选择器类型,但您可以以相同的方式添加它们。除了 xpath 选择器,我认为不可能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2012-09-16
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2017-07-02
    相关资源
    最近更新 更多