Selenium WebDriver jQuery

2024-04-25

我对 Selenium WebDriver 非常陌生,我正在学习如何使用 jQuery 选择器来处理元素,而不是使用 XPath 表达式、ID 等...

您能否提供一个链接来帮助我,在该链接中我可以找到有关如何在 Selenium WebDriver 中使用 jQuery 的一些基本信息?


你不应该。 JQuery 选择器提供了 CSS 2 和 CSS 3 选择器的大部分功能,以及更多功能,但您可能没有它也可以生活。如果您了解 JQuery 选择器,那么您就已经了解 CSS 选择器。

在可以的地方使用 CSS 选择器,在不够的地方使用 XPath 表达式(它们更强大)。我怀疑您会发现许多实际用途,而这两者还不够(然后,通常的方法是获取您可以获取的内容并迭代集合,手动过滤结果)。


也就是说,您也可以强制 WebDriver 接受 JQuery 选择器:

如果您只想支持一两个浏览器,最简单的方法可能是向该浏览器编写一个简单的插件,该插件会将 JQuery 注入到每个页面(如果尚不存在)。然后,您将强制您正在使用的浏览器使用此插件。

如果您想支持所有浏览器,该解决方案很快就会成为一种负担,您能做的最好的事情就是为 WebDriver 编写一个装饰器,该装饰器会尝试在任何浏览器之前将 JQuery 注入到页面中。findElements() and/or executeScript()调用(如果尚未存在)。

See 这个问题 https://sqa.stackexchange.com/questions/2921/webdriver-can-i-inject-a-jquery-script-for-a-page-that-isnt-using-jquery了解有关注入 JQuery 的想法。

注入后,您只能通过 JavaScript 再次使用它:

// earlier
if (driver instanceof JavascriptExecutor) {
    js = (JavascriptExecutor)driver;
} else {
    throw new IllegalStateException("This driver cannot run JavaScript.");
}

WebElement element = (WebElement)js.executeScript("$('div.account').get(0)");
// or
List<WebElement> elements = (List<WebElement>)js.executeScript("$('div.account').get()");

您可以轻松地将这些行包装成新的By对象,或者一个新的findElement(String jQuerySelector)装饰WebDriver的方法,如果你愿意的话,但这取决于你的方便和懒惰,我们让它工作......


我认为最好的方法是创建一个新的By实施称为ByJQuery. See 这个答案 https://stackoverflow.com/a/19460561/1273080关于如何制作一个ByJavaScript- 重用它、将 JQuery 注入页面并运行实际查询只是一小步。

class ByJQuery extends By implements Serializable {
    private final String query;

    public ByJQuery(String query) {
        checkNotNull(query, "Cannot find elements with a null JQuery expression.");
        this.query = query;
    }

    @Override
    public List<WebElement> findElements(SearchContext context) {
        WebDriver driver = getWebDriverFromSearchContext(context);

        if (!isJQueryInThisPage(driver)) {
            injectJQuery(driver);
        }

        return new ByJavaScript("return $(" + query + ")").findElements(context);
    }

    private static WebDriver getWebDriverFromSearchContext(SearchContext context) {
        if (context instanceof WebDriver) {
            return (WebDriver)context;
        }
        if (context instanceof WrapsDriver) {
            return ((WrapsDriver)context).getWrappedDriver();
        }
        throw new IllegalStateException("Can't access a WebDriver instance from the current search context.");
    }

    private static boolean isJQueryInThisPage(WebDriver driver) {
        // TODO Some JavaScript test for a JQuery object.
    }

    private static void injectJQuery(WebDriver driver) {
        // TODO Load JQuery from a file, inject it into the page via JS.
    }

    @Override
    public String toString() {
        return "By.jQuery: \"$(" + query + ")\"";
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Selenium WebDriver jQuery 的相关文章

随机推荐