Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Selenium按对象转换为CSS选择器?_Css_Selenium_Selenium Webdriver_Css Selectors_Browser Automation - Fatal编程技术网

如何将Selenium按对象转换为CSS选择器?

如何将Selenium按对象转换为CSS选择器?,css,selenium,selenium-webdriver,css-selectors,browser-automation,Css,Selenium,Selenium Webdriver,Css Selectors,Browser Automation,在SeleniumWebDriver中,使用By查找对象是非常常见的。我目前正在使用一个ByChained选择器,我想知道有没有办法将By对象转换为CSS选择器?例如: By selector = By.id('something'); String cssSelector = selector.toCSSselector(); // now cssSelector = "#something" 据我所知,没有办法通过代码将一种定位器类型转换为另一种定位器类型 您可以编写任何定位器(除了一些X

在SeleniumWebDriver中,使用
By
查找对象是非常常见的。我目前正在使用一个
ByChained
选择器,我想知道有没有办法将
By
对象转换为CSS选择器?例如:

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

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


您可以编写任何定位器(除了一些XPath,例如包含文本)作为CSS选择器。只要把它们都写成CSS选择器就可以解决你的问题。例如,可以使用CSS选择器“某物”定位您的id。如果您需要
,只需在CSS选择器中添加一个逗号,例如,“someId,#some.cssSelector”就是来自mrfreester注释的示例。如果必须对包含的文本使用XPath,则有一种方法可以指定

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

您可以编写任何定位器(除了一些XPath,例如包含文本)作为CSS选择器。只要把它们都写成CSS选择器就可以解决你的问题。例如,可以使用CSS选择器“某物”定位您的id。如果您需要
,只需在CSS选择器中添加一个逗号,例如,“someId,#some.cssSelector”就是来自mrfreester注释的示例。如果您必须对包含的文本使用XPath,那么有一种方法可以在其中指定

这是一种黑客攻击,但在大多数情况下都有效。所以如果你真的需要,你可以这样做:

    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选择器,我认为这是不可能的。

这是一个黑客攻击,但它可以工作(在大多数情况下)。所以如果你真的需要,你可以这样做:

    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选择器,我认为这是不可能的。

您试图实现的目标可以使用monkeypatching实现,但是我不确定它在java中是否可行。在python中,这很简单。但是,如果您可以使用从id或xpath返回CSS选择器的方法创建另一个类。这不管用吗?会的,但也会有更复杂的情况,比如ByChained等。当使用
ByChained
时,编写起来并不那么容易。文档使您看起来可以使用不同的选择器。所以我的问题是,为什么需要从一个
By
转换到另一个?类似于
ByChained(By.id(“someId”)、.cssSelector(“some.cssSelector”))
ByChained
的意思是只取第一个
,然后在其子级上查找下一个,依此类推。我需要一个由
提供的
CSS选择器,因为我正在编写一个应用程序,该应用程序将代理置于selenium和我的测试应用程序之间,并注入侦听特定事件的js(我需要CSS选择器,以便我能检测到事件),从而记录测试用例。您试图实现的功能可以使用monkeypatching完成,然而,我不确定它在java中是否可行。在python中,这很简单。但是,如果您可以使用从id或xpath返回CSS选择器的方法创建另一个类。这不管用吗?会的,但也会有更复杂的情况,比如ByChained等。当使用
ByChained
时,编写起来并不那么容易。文档使您看起来可以使用不同的选择器。所以我的问题是,为什么需要从一个
By
转换到另一个?类似于
ByChained(By.id(“someId”)、.cssSelector(“some.cssSelector”))
ByChained
的意思是只取第一个
,然后在其子级上查找下一个,依此类推。我需要一个来自
By
的CSS选择器,因为我正在编写一个应用程序,该应用程序将代理置于selenium和我的测试应用程序之间,并注入侦听特定事件的js(我需要CSS选择器,以便我能检测到事件),从而记录测试用例。”你可以编写任何定位器(除了一些XPath,例如包含文本的)这正是我认为我可以通过对象转换为CSS选择器的原因。问题是,我必须为一个已经存在的应用程序创建一个recorded in JS,它已经使用了不同的
By
对象,而不仅仅是
By.cssSelector
“你可以编写任何定位器(除了一些XPath,例如包含文本)作为CSS选择器。”这正是我认为可以将By objects转换为CSS选择器的原因。问题是,我必须为一个已经存在的应用程序创建一个recorded in JS,它已经使用了不同的
By
对象,而不仅仅是
By.cssSelector