如何将Selenium按对象转换为CSS选择器?
在SeleniumWebDriver中,使用如何将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
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