我在使用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]”

但是我认为这不是解决问题的正确方法。

谢谢您的建议。

最佳答案

您的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);

您想要的任何父元素。

09-27 18:32