我对CSS定位器有疑问。我为父母有一个唯一的标签,从那里我可以得到所需的孩子。
@FindBy(css = "[data-qa="select-Seller"] .select__value-container")
Webelement seller;
public Webelement getSeller(){ return seller; }
该类与所有下拉列表相似,因此唯一会更改的值为data-qa
。另外,有时我需要取消选择它们。
为此,我有一个X
定位器。
@FindBy(css = "[data-qa="select-Seller"] [data-qa=icon-x]).
如您所见,第一部分仍然相同。
所以我的问题是是否有可能编写一些方法(或任何其他方式)来更改定位器的最后一部分?我有600多个下拉菜单,并且为X
创建600多个新定位符会让我发疯。
对我来说,执行类似element.click\sendkeys\...\
之类的最佳方法是使用默认部分(与.select__value-container
一起使用),但是如果我编写类似element.deselect
之类的东西,它将改变定位符,但我不知道如何。
我写了这样的东西:
public void clearDropdown (WebElement element){
String selector = element.toString();
selector = selector.split(" ")[8];
driver.findElement(By.cssSelector(selector + " [data-qa=icon-x]")).click();
}
[[ChromeDriver:MAC上的Chrome(99c7e4e38147c9f61da0c83c5ef1b992)]-> CSS选择器:[data-qa ='select-Seller'] .select__value-container] -这就是为什么“ split(” “)[8]”
但是我认为这不是解决问题的正确方法。
谢谢您的建议。
答案 0 :(得分:2)
您不必尝试串联CSS选择器。
如果您可以将父级定义为WebElement
,则会更容易:
WebElement seller = driver.findElement(By.cssSelector("[data-qa=select-Seller]"));
然后找到其中的元素:
WebElement sellerDropdown = seller.findElement(By.cssSelector(".select__value-container"));
WebElement closeButton = seller.findElement(By.cssSelector("[data-qa=icon-x]"));
请注意,我们如何对子元素使用seller.findElement
而不是driver.findElement
。
我不确定100%如何用FindBy
来描述,请看一下是否有帮助:
答案 1 :(得分:1)
您使用clearDropdown()
方法的想法是正确的,只有一种更有效的方法可以达到目标。
卖家将被定义为父级,例如
@FindBy(css = "[data-qa='select-Seller']")
Webelement sellerParent; // probably needs a better name
然后,您将基于父元素为要获取或与之交互的每个元素定义一个方法。
public void clearDropdown(WebElement element)
{
element.findElement(By.cssSelector("[data-qa=icon-x]")).click();
}
// probably needs a better name
public WebElement getChild(WebElement element)
{
return element.findElement(By.cssSelector(".select__value-container"));
}
现在您可以这样称呼
clearDropdown(sellerParent);
或
WebElement seller = getChild(sellerParent);
针对您想要的任何父元素。