无法单击隐藏的元素,只有将鼠标悬停在父元素上之后,该元素才会可见

时间:2019-12-06 10:29:14

标签: javascript selenium selenium-webdriver selenium-chromedriver

有10个项目。我需要单击item_9中的隐藏元素(项目图标)。悬停在他身上后,隐藏的元素就会出现。我有相同的情况,并且相同的代码按预期运行。但是在这种情况下,代码会意外运行,并在控制台中出现错误。 如何单击item_9元素中的item-icon元素?

html:

<div class="item">
 <div class="w">item_1</div>
  <div class="d">
    <div style="display:none" class="item-icon" role="button" tabindex="-1">
      button1
    </div>
    <div style="display:none" class="item-icon">
      button2
    </div>
  </div>
</div>
<div class="item">
  <div class="w">item_2</div>
  <div class="d">...</div>
</div>
      ...

<div class=""><div class="item">
  <div class="w">item_10</div>
  <div class="d">...</div>
</div></div>

js:

let findItems = await driver.findElements(By.className("item"));
let items = findItems.map(async elem => await elem.getText());
let allItems = await Promise.all(items);
await driver.findElement(By.xpath(`//div[@class='item'][9]//div[@class='item-icon'][2]`)).click();

控制台错误:

{ NoSuchElementError: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@class='item'][9]//div[@class='item-icon'][2]"}

2 个答案:

答案 0 :(得分:1)

请尝试使用JavascriptExecutor单击隐藏的元素。

Java中的示例代码:

JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("arguments[0].click();", element);

答案 1 :(得分:1)

如果该元素存在,但是出现错误“ NoSuchElementError”,则意味着您试图在代码中找到的元素存在于网页的“ iframe”标记中。 例如

<iframe id="iframeID">
<div class="item">
  <div class="w">item_2</div>
  <div class="d">...</div>
</div>
      ...
</iframe>

您需要做的是切换到该iframe,然后找到类名称为“ item”的元素。

driver.switchTo().frame("iframeNameOrID"); //you can use name or id for that iframe
//OR driver.switchTo().frame(0); the zero is the first iframe, you can use 1 for 2nd and so on...
let findItems = await driver.findElements(By.className("item"));
driver.switchTo().defaultContent(); //switch back to the main webpage
//...

我假设您已经将代码悬停在代码上之前就已经看过,并且如果您未将代码悬停在元素上,那么您提供的代码也将有效。我正在根据提供的数据进行回答:-)

如果没有框架... 使用硒悬停

启动页面且不进行悬停,请使用Chrome DevTools选择应悬停的区域。这将向您显示您需要悬停的元素。您可以对该元素执行element.click(),然后将执行Java脚本来创建所需的元素“ item”。

我希望这会有所帮助...在评论中留下问题:-)