如何清除硒中不可见元素的文字?

时间:2019-03-19 15:56:58

标签: javascript java selenium selenium-webdriver

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

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那样标识其他元素(基本上,我希望获得与调用时相同的结果getText(),其中 only 例外,其中包含隐藏元素)

这可能吗?

谢谢

更新

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

1 个答案:

答案 0 :(得分:-1)

在您给出的从Amazon产品中获取价格的示例中,这三个选项都将返回相同的值,因为元素中除文本外没有其他内容。

<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>

它将返回<strong>$26.99</strong>,而不只是$26.99

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

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