【问题标题】:Selenium : How to enter text in div inside an iframeSelenium:如何在 iframe 内的 div 中输入文本
【发布时间】:2018-04-19 10:33:54
【问题描述】:

HTML 代码:

<div class="listRte__editorFrame">   
     <iframe src="about:blank" style="height: 150px;">
           #document
                <html>
                   <head>
                       <body>
                            <button class="__clipped">
                                  <div data-ghosttext="Add a detailed description here." contenteditable="true">
                                   ::after
                                  </div>
                             </button>
                        </body>
                    </head>
              </html>
        </iframe>
 </div>

我想在 div 中键入文本。 手动添加文本后的html:

<div contenteditable="true">abcd</div>

我尝试使用 javascript 输入文本:

JavascriptExecutor jse = (JavascriptExecutor)driver;
        jse.executeScript("document.evaluate('//div[@data-ghosttext=\"Add a detailed description here.\"]', document, null, 9, null).singleNodeValue.innerHTML="+ "\"abc\"");

但它给了我错误:

org.openqa.selenium.JavascriptException: TypeError: document.evaluate(...).singleNodeValue 为空


我也尝试切换到 iframe,但切换到 iframe 时无法识别 div。另外,当我尝试执行以下命令时,我得到了size=0。但是,当我检查元素时,页面上有 3 个 iframe。

 int size = driver.findElements(By.tagName("iframe")).size();

能否请我在 Java/js 中获取确切的命令,我可以使用它在 div 元素中键入内容。 我使用 testng 框架研究 selenium

【问题讨论】:

  • 您的问题是否已解决,或者您仍在寻找答案?
  • 解决了。我所要做的就是先切换 iFrame,然后像往常一样在 div 元素中传递文本。这里不需要 JavaScript。

标签: javascript java selenium


【解决方案1】:

您必须先切换到适当的frame,然后尝试在div 中传递任何文本,如下所示:

driver.switchTo().frame(driver.findElement(By.xpath("//div[@class='listRte__editorFrame']//following::iframe[1]")));

【讨论】:

    【解决方案2】:

    但它给了我错误:org.openqa.selenium.JavascriptException: ReferenceError: abcd 未定义

    abcd 也需要加引号

    JavascriptExecutor jse = (JavascriptExecutor)driver;
    jse.executeScript("document.evaluate('//html//body//div', document, null, 9, null).singleNodeValue.innerHTML="+ "'abcd'");
    

    转义双引号

    JavascriptExecutor jse = (JavascriptExecutor)driver;
    jse.executeScript("document.evaluate('//html//body//div', document, null, 9, null).singleNodeValue.innerHTML="+ "\"abcd\"");
    

    或者干脆

    jse.executeScript("document.querySelector( 'div' ).innerHTML = " + "'abcd'" );
    

    【讨论】:

    • 谢谢。但是在添加引号后,我收到了一个新错误:org.openqa.selenium.InvalidElementStateException: Element must be user-editable to clear it.
    • org.openqa.selenium.InvalidElementStateException: 元素必须是用户可编辑的才能清除它。
    • 所以,它无法识别元素,也许你的xpath 是错误的。您尚未在此处共享相关标记。反正你当初问的问题已经解决了。
    • 嘿,谢谢!我在下一行遇到错误。我删除了。
    【解决方案3】:

    获取列表尝试:

    List<WebElement> listFrames = driver.findElements(By.tagName("iframe"));
    System.out.println("list frames   "+listFrames.size());
    

    下一步 切换到框架

    driver.switchTo().frame(listFrames.get( frameIndex ));
    

    然后尝试输入该文本。

    【讨论】:

      猜你喜欢
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-09
      • 2012-04-11
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      相关资源
      最近更新 更多