无法使用 selenium webdriver (javascript) 单击 iframe 中的按钮

Unable to click button inside iframe with selenium webdriver (javascript)

提问人:marchello 提问时间:10/27/2017 最后编辑:marchello 更新时间:11/6/2017 访问量:1046

问:

我有一个加载 iframe 的页面,但我收到错误消息。 我的代码:NoSuchElementError

driver.wait(until.ableToSwitchToFrame(0)).then((d) => {
  //*** SLEEP HERE
  const button = By.css(".button");
  driver.wait(until.elementLocated(dropdownElem)).then((btn) => {
    btn.click();
  });
});

首先,我切换到正确的 iframe,然后尝试等待元素在 iframe 中加载。 如果我在行中插入 a,它会起作用,否则它会失败并显示:driver.sleep(1000);//*** SLEEP HERE

NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":".button"
}

为什么该行不等待元素可用?driver.wait

selenium selenium-webdriver webdriver chrome-web-driver

评论

0赞 user1207289 10/30/2017
你试过waitUntil 吗?
0赞 marchello 10/30/2017
我正在使用 selenium-webdriver nodejs 绑定,这是由 selenium 维护的官方绑定。您链接的是 webdriverIO,一个不同的库。
0赞 iamdanchiv 10/30/2017
@marchello,你为什么把这个问题标记为相关?webdriverio
0赞 marchello 10/31/2017
@iamdanchiv,我想要这个标签。我的错误。现在更正了。webdriver

答:

1赞 user1207289 11/6/2017 #1

我在本地测试了这一点,它似乎适用于 Iframe 中的按钮。代码如下

var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder().usingServer().withCapabilities({'browserName': 'chrome' }).build();
 driver.get('file:///Users/../sampleFiles/sample-iframe.html');
driver.wait(webdriver.until.ableToSwitchToFrame(0)).then((d) => {
  //*** SLEEP HERE
  const button = webdriver.By.css(".Button");
  driver.wait(webdriver.until.elementLocated(button)).then((btn) => {
    btn.click();
   btn.getTagName().then((tag) => { 
      console.log(tag);
    });
  });


});

我进入控制台button

和测试的 Iframe HTML 是

<html lang="en"><head>
    <meta charset="UTF-8">
    <title>Example of HTML Iframe</title>
</head>
<body>
    <iframe src="file:///Users/../sampleFiles/sample.html" width="300" height="200">
        <html><head>
<title>Page Title</title>
</head>
<body>

<h1>This is a Heading</h1>
<p>This is a paragraph.</p>
<button id="ButtonID" class="Button">Click Me!</button>


</body></html>
    </iframe>

  </body></html>

检查你的行,似乎有错别字,把它改成driver.wait(until.elementLocated(dropdownElem))

driver.wait(until.elementLocated(button ))然后重试