javascript - Selenium 找到 remoteWebElement 而不仅仅是 webElement?

标签 javascript jquery css selenium

我有这个 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。

基本上是这样的:

  1. 当您发出 find... 方法之一时,Selenium 客户端(即调用 Selenium 方法的代码)告诉 Selenium 服务器(位于浏览器中)执行搜索并返回一个元素。 Selenium 服务器在 DOM 中搜索元素并返回它们,但它实际返回的不是元素本身,而是分配给 DOM 元素的标识符。这样做是因为序列化实际 DOM 元素的成本非常高,还有其他问题。

  2. 在客户端,您的代码从 Selenium 服务器接收这些标识符。每个标识符都存储在代表 DOM 元素的 RemoteWebElement 对象中。

  3. 当您在 RemoteWebElement 上执行类似 getAttribute 的方法时,客户端的 Selenium 使用它存储的标识符并将其传递给线路中的命令请求服务器对具有此标识符的元素执行操作的协议(protocol)。

find... 方法实际上可以查找 用户无法与之交互的元素。 (我一直这样做。)但是,如果您尝试使用 Selenium 命令(例如使用 click())与这些元素交互,Selenium 会提示该元素不能与之互动。通常,这意味着您必须执行某些操作才能使元素可见,或者必须等待某些条件或其他条件。

关于javascript - Selenium 找到 remoteWebElement 而不仅仅是 webElement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26774881/

相关文章:

javascript - 通过包含 HTML 的变量来检查特定单词

javascript - json 返回我的 header 数据

JQuery Masonry 不刷新容器高度

jquery - 如何在使用带滚动的表格单元格时设置动态高度?

c# - 如何使图像随着浏览器大小的动态变化而自动调整大小?

css - 如何根据分辨率计算 CSS 像素?

javascript - 检查数组中是否有重复项

javascript - 通过对象设置 HTML Canvas 上下文

javascript - 指令中选择输入的两种方式绑定(bind)不起作用

javascript - 无论屏幕尺寸如何,动态完美居中灯箱