Selenium找到remoteWebElement而不仅仅是webElement?

Ela*_*nda 1 javascript css jquery 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>
Run Code Online (Sandbox Code Playgroud)

我有这个代码:

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时,inspect element tool我会得到一个包含文字的元素

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

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

Lou*_*uis 5

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

基本上,它是这样的:

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

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

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

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