硒查找元素嵌套在iframe> frameset> frameset> frame中

时间:2019-05-02 16:39:02

标签: javascript html node.js selenium

这是一个关于硒的问题,还有关于JS的问题!
因此,请不要使用JS以外的任何其他语言发布答案。
我尝试并无法翻译其他语言的答案。如果您知道可以自动将Selenium代码转换为JS等价物并且可以工作的工具,请告诉我。

我想单击带有硒的项目(selenium-webdriver,使用nodejs),但是当我按ID搜索时找不到所需的元素。

我尝试了许多不同的事情,例如切换框架,但是这种嵌套确实使我受益匪浅。

我将html大页面剥离为基本内容:
-我的目标是选择ID为a

action标签
<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <title>Selenium Test</title>
  </head>
  <body>
    <div id="mainDiv">
      <div id="appFrameContainer">
        <iframe name="appFrame" id="appFrame" src="/longlink">
          #document
          <!DOCTYPE HTML>
          <html>
            <head></head>
            <frameset>
              <frameset id="frameset2">
                <frame src="/longlink2" name="frame1" id="frame1">
                #document
                <!DOCTYPE HTML>
                <html xmlns="http://www.w3.org/1999/xhtml">
                  <head></head>
                  <body>
                    <div id="menu">
                      <table class="table">
                        <tbody>
                          <tr>
                            <td>
                              <div>
                                <ul>
                                  <li id="item">
                                    <span>
                                      <a id="action"> 
                                        Execute Action
                                      </a>
                                    </span>
                                  </li>
                                </ul>
                              </div>
                            </td>
                          </tr>
                        </tbody>
                      </table>
                    </div>
                  </body>
                </html>
                </frame>
              </frameset>
            </frameset>
          </html>
        </iframe>
      </div>
    </div>
  </body>
</html>

(不幸的是,当我将文本粘贴到html文件中时,这是一个缩小的示例,第二个body标签保持空白,我不知道为什么。)

我现在正在尝试类似的操作并收到错误消息:
UnhandledPromiseRejectionWarning: InvalidArgumentError: data did not match any variant of untagged enum FrameId at line 1 column 28

//Setup
const Capabilities = require('selenium-webdriver/lib/capabilities').Capabilities;
let capabilities = Capabilities.firefox();
capabilities.set('acceptInsecureCerts', true);
const firefox = 'firefox';
let driver = new Builder()
    .forBrowser(firefox)
    .withCapabilities(capabilities)
    .build();
driver.get("<url>").then(startAutomation).catch();

//Process
async function startAutomation() {
    let mainFrameName = "appFrame";
    let idAction = "action";

    driver.switchTo().frame(mainFrameName);
    driver.findElement(By.id(idAction)).then(e => {
         e.click();
    });
}

1 个答案:

答案 0 :(得分:0)

能否请您检查以下代码是否对您有用(请单击具有id =“ action”的锚标记)

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("document.getElementById('appFrame').contentWindow.document.getElementById('action').click();")