【发布时间】:2019-08-10 05:26:15
【问题描述】:
在我的程序中,我有时需要抓取不可见/隐藏的网络元素的文本。我知道WebDriver 通常会返回可见文本,并且可以通过以下方法之一刮取隐藏/不可见文本(如this 和this 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 将全部返回 <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