如何刮去硒中隐形元素的文本?

问题描述 投票:0回答:1

在我的程序中,我有时需要刮掉不可见/隐藏的web元素的文本。我知道WebDriver通常返回可见文本,并且可以通过以下方法之一刮取隐藏/不可见文本(如在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()时相同的结果,唯一的例外是它包括隐藏的元素)

这可能吗?

谢谢

更新:

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

javascript java selenium selenium-webdriver
1个回答
-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>

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

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

如果你想在this answer中获得更多细节,可以更深入地解释三者之间的差异(以及其他未提及的)。

© www.soinside.com 2019 - 2024. All rights reserved.