我在Eclipse中使用Java,Selenium Webdriver。
我编写了一个辅助方法来等待元素存在,滚动到它,等待元素可见并单击它。这就是我所拥有的:
protected void waitScrollWaitClick(By by, String scroll)
{
wait.until(ExpectedConditions.presenceOfElementLocated(by));
getJse().executeScript("$('.mCustomScrollbar#" + scroll + "').mCustomScrollbar('scrollTo',document.querySelector(\"" + by.selector + "\"), {scrollInertia:0})");
wait.until(ExpectedConditions.visibilityOfElementLocated(by));
getDriver().findElement(by).click();
现在我遇到的问题是在方法的第二行。我正在传递一个By对象。这适用于1,3,4行的传统Webdriver方法。但由于我们正在为我们的Web应用程序使用自定义滚动条,我需要使用该JavascriptExecutor类(getJse())滚动正确的div #id(从而传入' scroll'参数)。要使用该JSE,我只需要CSS选择器,而不是整个By对象。如果我添加一个断点并查看,By对象包含一个'选择器'有我想要的字段(在Eclipse中有一个带有' F'的红色方块图标),但我似乎无法访问它。我尝试使用" by.selector"在上面的代码中,但这是一个编译错误。
如何使用该选择器字段?我不是Java专家,所以也许我错过了一些明显的东西。我想我不明白为什么我可以停在断点上,看到我在变量选项卡中创建的By对象,展开By对象并查看'选择器'我想要的字段,但无法访问它。
答案 0 :(得分:1)
简单的答案是,您无法从By
类型甚至WebElement
类型获取CSS选择器。这是因为WebElement
类可以找到By
个本身。如果指定的By
为xpath
,则无法填充CSS选择器。
专门针对您的问题的长答案,获取CSS Selector将是使用Javascript创建它。一个例子是Florent B.答案here。但是,我没有尝试自己,我不知道它是否适用于所有情况。
现在,要解决一般问题,请不要使用document.querySelector
使用document.getElementById
,以防您的元素具有ID。
或者使用document.evaluate
通过xpath获取元素。您可以在发布的答案here中找到一个示例。