Selenium找到remoteWebElement而不仅仅是webElement?

时间:2014-11-06 08:31:31

标签: 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,它的标识为0.01973947323858738-2,文本为空字符串。

element.getText()返回""

element.getAttribute("class")返回"address"

所以它找到了正确的元素,并且不需要wait但仍然无法获得文本

当我使用Chrome inspect element tool时,我会收到一个带文字的元素

$("#preview-header > div > div > p.address").text()

RemoteWebElement是什么意思?这可能是我将空字符串设为getText()的原因吗?

3 个答案:

答案 0 :(得分:5)

正如Surya在评论中提到的RemoteWebElement是实现WebElement接口的类。您看到的与RemoteWebElement对象关联的奇怪ID字符串是Selenium用于其自身目的的ID。

基本上,就像这样:

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

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

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

  4. find...方法实际上没有问题查找用户无法与之交互的元素。 (我一直这样做。)但是,如果你试图用Selenium命令交互(比如使用click()),Selenium会抱怨该元素无法与之交互。通常,这意味着您必须做一些事情才能使元素可见或必须等待某些条件或其他条件。

答案 1 :(得分:1)

Selenium旨在模仿用户。 Selenium不会与用户不可见的元素相互作用。这是设计的。在Selenium与之交互之前,您需要执行任何必要的操作才能使元素对用户可见。

答案 2 :(得分:0)

问题是我的元素在DOM中但对用户不可见。

我不知道为什么,但只有当我按下向用户显示此元素的标签时,selenium web drive才能找到它。

这很奇怪,因为我知道元素在按下此标签之前就已存在,因为我可以使用inspect element tool找到它。