我的CSS定位器有问题。我为父母有一个独特的标签,从那里我可以得到所需的孩子。
@FindBy(css = "[data-qa="select-Seller"] .select__value-container") Webelement seller; public Webelement getSeller(){ return seller; }
该类与所有下拉列表相似,因此唯一会改变的值是data-qa。另外,有时我需要取消选择它们。
data-qa
为此,我有一个X定位器。
X
@FindBy(css = "[data-qa="select-Seller"] [data-qa=icon-x]).
如您所见,第一部分仍然相同。
所以我的问题是是否有可能编写一些方法(或任何其他方式)来更改定位器的最后一部分?我有600多个下拉菜单,并且为600个新定位器创建了一个目标,X这使我发疯。
对我来说,执行类似操作的最佳方法是element.click\sendkeys\...\使用默认部分(带有.select__value- container),但是如果我编写类似内容element.deselect,它将更改定位器,但我不知道如何操作。
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()只有一种更有效的方法可以达到目标。
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);
您想要的任何父元素。