【问题标题】:How to Scrape Text of Invisible Element in Selenium?如何在 Selenium 中刮掉不可见元素的文本?
【发布时间】:2019-08-10 05:26:15
【问题描述】:

在我的程序中,我有时需要抓取不可见/隐藏的网络元素的文本。我知道WebDriver 通常会返回可见文本,并且可以通过以下方法之一刮取隐藏/不可见文本(如thisthis SO 上的线程中所建议):

JavascriptExecutor js = (JavascriptExecutor) driver; 
scrapedText = js.executeScript ("return arguments[0].innerHTML", webElement).toString();

或者通过调用:

element.attribute('textContent')

element.attribute('innerText')

element.attribute('innerHTML')

虽然这两种解决方案都有效,但它们将检索不仅不可见而且通常无法通过getText() 方法识别的文本。例如在以下 HTML 中:

<div class="a-section a-spacing-none">
<a id="brand" class="a-link-normal" href="/abc-d/b/ref=w_bl_sl_l_ap_ap_web_258XXX11?ie=UTF8&node=258XXX11&field-lbr_brands_browse-bin=abc+d">
<img id="brand" src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/brands/byline-logo/25xxx11._CB520xxx1_SR120,50_.jpg" alt=""/>
</a>
</div> 

textContent, innerText or innerHTML 将全部返回 &lt;img 元素,即使我正在尝试识别 'href' 属性(使用 XPath '//a[contains(@href, 'brands_browse-bin')]' )

换句话说,我正在尝试创建一个通用解决方案,我的程序将始终识别不可见/隐藏元素,而不会像使用 textContent, innerText or innerHTML 时那样识别其他元素(基本上我想要与调用 @987654335 时相同的结果@ 只有例外,它包含隐藏元素)

这可能吗?

谢谢

更新:

如果您导航到:https://www.amazon.com/dp/B01H4LBIVC 并尝试抓取“价格”(例如通过 .//*[@id='priceblock_ourprice']),它将无法工作,因为该元素不可见(我知道我可以通过单击“一个”使其可见-时间购买')。如果我决定通过上面列出的方法之一来检索元素 - 我将能够检索价格,但它也会在上面提供的 HTML 示例中检索错误的值。如果有一种方法可以识别隐藏元素(类似于 getText() )但不自动包含“innerHTML”等,则不会出现此问题。简而言之,我需要一个通用的解决方案来识别“价格”(在上面的示例中隐藏),并在上面的 HTML sn-p 中识别正确的元素。

【问题讨论】:

  • 嗨@S.O.S,你能试试这个代码吗? JavascriptExecutor js = (JavascriptExecutor) driver; WebElement element = driver.findElement(By.id("brand")); String scrapedText = js.executeScript ("return arguments[0].href;", element).toString();
  • @AliCSE 感谢您的回复。这可行,但是我正在尝试创建一个通用解决方案,其中我的程序 1)识别可见和不可见元素 2)无论特定的 HTML 属性如何,解决方案都有效。如果属性为“href”,则上述解决方案有效,但在属性更改时将不起作用。基本上,我想识别与 getText() 完全相同的元素,但添加了识别隐藏元素的选项。更新问题和一些额外的细节..

标签: javascript java selenium selenium-webdriver


【解决方案1】:

在您给出的从亚马逊产品中检索价格的示例中,三个选项都将返回相同的值,因为元素内除了文本之外没有任何内容。

<span id="priceblock_ourprice" class="a-size-medium a-color-price">$26.99</span>

这三个选项之间的区别在于其中包含格式或其他 HTML 元素。例如,如果您在下面的示例 HTML 中使用 .innerHTML

<span id="priceblock_ourprice" class="a-size-medium a-color-price"><strong>$26.99</strong></span>

它将返回&lt;strong&gt;$26.99&lt;/strong&gt;,而不仅仅是$26.99

最简单的选择(也是您似乎想要的)是始终使用.textContent。它只会返回包含的文本(从不返回 HTML 标记等)。此时,您需要适当地提供定位器来查找包含所需文本的元素。

如果您想在this answer 中获得更多详细信息,可以更深入地解释这三者之间的区别(以及其他未提及的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2016-07-18
    • 1970-01-01
    相关资源
    最近更新 更多