我有这个 html:
<div><div class="header">
<img class="header-map" src="/assets/preview/header_map.png">
<img class="logo-img" src="https://w-assets.s3.amazonaws.com/2x/.png">
<p class="title">2014-11-06-093755</p>
<p class="address">דיזנגוף 40, תל אביב - יפו</p>
</div></div>
我有这个代码:
WebElement element = driver.findElement(By.cssSelector("#preview-header > div > div > p.address"));
当我在运行时进行调试时,我看到 element
属于 RemoteWebElement
类型并且它具有奇怪的 ID 0.01973947323858738-2
和文本空字符串。
element.getText()
返回 ""
element.getAttribute("class")
返回 "address"
所以它找到了正确的元素,并且不需要 wait
但我仍然无法获取文本
当我使用 Chrome 检查元素工具
时,我得到一个带有文本的元素
$("#preview-header > div > div > p.address").text()
RemoteWebElement
是什么意思?这可能是我得到空字符串作为 getText()
的原因吗?
最佳答案
正如 Surya 在评论中提到的,RemoteWebElement
是实现 WebElement
接口(interface)的类。您看到的与 RemoteWebElement
对象关联的奇怪 ID 字符串是 Selenium 用于其自身目的的 ID。
基本上是这样的:
当您发出
find...
方法之一时,Selenium 客户端(即调用 Selenium 方法的代码)告诉 Selenium 服务器(位于浏览器中)执行搜索并返回一个元素。 Selenium 服务器在 DOM 中搜索元素并返回它们,但它实际返回的不是元素本身,而是分配给 DOM 元素的标识符。这样做是因为序列化实际 DOM 元素的成本非常高,还有其他问题。在客户端,您的代码从 Selenium 服务器接收这些标识符。每个标识符都存储在代表 DOM 元素的
RemoteWebElement
对象中。当您在
RemoteWebElement
上执行类似getAttribute
的方法时,客户端的 Selenium 使用它存储的标识符并将其传递给线路中的命令请求服务器对具有此标识符的元素执行操作的协议(protocol)。
find...
方法实际上可以查找 用户无法与之交互的元素。 (我一直这样做。)但是,如果您尝试使用 Selenium 命令(例如使用 click()
)与这些元素交互,Selenium 会提示该元素不能与之互动。通常,这意味着您必须执行某些操作才能使元素可见,或者必须等待某些条件或其他条件。
关于javascript - Selenium 找到 remoteWebElement 而不仅仅是 webElement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26774881/