【问题标题】:How to integrate Jsoup with WebDriver?如何将 Jsoup 与 WebDriver 集成?
【发布时间】:2014-05-20 19:36:49
【问题描述】:

在我的 WebDriver 项目中,我计划添加 Jsoup 以获取“父”和“兄弟”以及其他一些功能。我需要通过 Jsoup 找到一个元素并使用 WebDriver 单击它的父元素。这意味着我需要将 Joup 元素对象转换为 WebElement 对象。如果可行,请告诉我该怎么做。

如果无法以这种方式集成 Jsoup 和 WebDriver,请讨论如何让父母和所有人使用 WebDriver。
此外,是否可以列出特定 WebElement 下存在的所有可能元素?

【问题讨论】:

    标签: selenium webdriver html-parsing jsoup


    【解决方案1】:

    您可以使用 xpath 选择器来选择父元素和子元素
    相关问题
    Select parent using xpath
    XML xpath, get the parent element till a specific element
    Getting child nodes using xpath?

    【讨论】:

    • 如何使用 Jsoup 确定元素的 xPath,以便使用该 xPath 进行 WebDriver 操作?要添加更多内容,我正在使用的网页具有 data-dojo-type 元素,并且属性值每 3 秒自动刷新一次。
    • @AbhishekMukherjee: 没试过 Jsoup 但你可以直接使用 Xpath 和 webdriver 来识别父/子
    • @Karna.. 我的项目的主要问题是,没有预定的 xPath 是可能的。它时不时地在变化。所以我必须使用Jsoup遍历。问题是:即使我使用 Jsoup 获得缩进元素,我也无法将该元素用作 WebElement 来应用 WebDriver API。
    • @AbhishekMukherjee 您可以使用 Xpath 表达式,即使 HTML 发生变化,它也不会(在某种程度上)发生变化。比如使用 id、name 或相对位置等
    • @Karna.. 我希望我能做到,但是! ID每3秒自动刷新一次。 WebDriver 不支持复合类名称。相对路径也不是静态的。而且我不能打赌所有其他元素属性的唯一性。
    【解决方案2】:

    在你的特定元素上运行 findElements 和 xpath : .//* 怎么样?另外,查看 xpath parent::*following-sibling::*。对于我理解的特殊情况,不需要 Jsoup。

    【讨论】:

    • @Erki.. 我的项目的主要问题是,不可能预先确定 xPath。它时不时地在变化。所以我必须使用 Jsoup 或任何其他方式遍历。问题是:即使我使用 Jsoup 获得缩进元素,我也无法将该元素用作 WebElement 来应用 WebDriver API。
    【解决方案3】:

    非常有趣的是,我们正在使用类似的方法,集成 JSoup 和 Selenium WebDriver。我可以理解您的问题,尤其是处理基于某些没有稳定 ID 或属性的 Javascript 框架的动态网站。

    我们的解决方案如下所示,希望能给您一些建议:

    • webDriver.getPageSource() 获取当前 HTML 源代码
    • 使用 JSoup 解析此 HTML 源代码,并利用 Jsoup 选择器(比 Selenium 强大得多)定位目标元素
    • 获取此元素的父母或兄弟姐妹
    • 编写迭代函数获取元素xPath,如//body/div[2]/form[1]/input[3]
    • webDriver.findElement(By.xpath(...)) 在 selenium 上下文中定位元素

    已编辑

    迭代函数的思路是:

    • 先检查你的父节点的tag,如果是body,则迭代结束
    • 如果不是,则使用getSiblings检查节点在所有具有相同标签的节点中的索引,例如第3个div,则等于div[3]
    • 迭代到您的父节点,并执行相同的过程

    得到子节点和父节点的xpath后,只需将父节点xpath替换为子节点xpath中的空字符串,就可以得到相对xpath了。

    【讨论】:

    • @SmartekWorks.. 感谢您的建议。这和我最初的想法非常相似。但我面临的问题是从 Jsoup 元素中确定相对 xPath。您能帮我分享一下您对如何编写迭代函数来获取相对 xPath 的想法吗?
    • @SmartekWorks.. 非常感谢您的想法。在我的项目中应用它时,我发现了另一个困难,即 html 页面的某些部分。 JSoup 解析所有内容(包括隐藏部分),但 WebDriver 不考虑隐藏部分。因此,有时会发生从 JSoup 确定的 xPath 对 WebDriver 无效的情况,因为隐藏的部分也很少。在大多数情况下甚至不存在 type="hidden" 。你有没有遇到过类似的问题?
    • @AbhishekMukherjee,我们从来没有遇到过这样的问题,无论是 input[type=hidden] 还是 css display:none,所有这些节点都在 Jsoup 和 Selenium 中计算在内。我们遇到的唯一区别是 Jsoup element.text() 将包含不可见文本,而 selenium getText() 仅包含可见文本。
    • @AbhishekMukherjee,还有一件事,如果您觉得有帮助,请将其设为答案,非常感谢!
    猜你喜欢
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 2016-07-04
    相关资源
    最近更新 更多