如何访问By对象的selector字段?

时间:2016-09-21 14:53:46

标签: selenium-webdriver

我在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对象并查看'选择器'我想要的字段,但无法访问它。

1 个答案:

答案 0 :(得分:1)

简单的答案是,您无法从By类型甚至WebElement类型获取CSS选择器。这是因为WebElement类可以找到By个本身。如果指定的Byxpath,则无法填充CSS选择器。

专门针对您的问题的长答案,获取CSS Selector将是使用Javascript创建它。一个例子是Florent B.答案here。但是,我没有尝试自己,我不知道它是否适用于所有情况。

现在,要解决一般问题,请不要使用document.querySelector使用document.getElementById,以防您的元素具有ID。

或者使用document.evaluate通过xpath获取元素。您可以在发布的答案here中找到一个示例。