Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当JS在Chrome控制台上正常工作时,Selenium JavaScript执行器返回null_Java_Javascript_Selenium - Fatal编程技术网

当JS在Chrome控制台上正常工作时,Selenium JavaScript执行器返回null

当JS在Chrome控制台上正常工作时,Selenium JavaScript执行器返回null,java,javascript,selenium,Java,Javascript,Selenium,我试图使用Selenium+ChromeDriver(Java驱动)将一些文本添加到iframe中的文本框中,我的堆栈跟踪中出现以下错误: org.openqa.selenium.WebDriverException:未知错误:无法读取null的属性“contentWindow” 我使用了一个断点来确保加载整个DOM,这样看起来就不会出现问题。我还在Chrome控制台中测试了我的JS,同时在JS.executeScript行的断点处测试,效果很好。然而,一旦我通过测试,它就会以同样的错误失败。J

我试图使用Selenium+ChromeDriver(Java驱动)将一些文本添加到iframe中的文本框中,我的堆栈跟踪中出现以下错误:

org.openqa.selenium.WebDriverException:未知错误:无法读取null的属性“contentWindow”

我使用了一个断点来确保加载整个DOM,这样看起来就不会出现问题。我还在Chrome控制台中测试了我的JS,同时在
JS.executeScript
行的断点处测试,效果很好。然而,一旦我通过测试,它就会以同样的错误失败。JS在Selenium中的运行方式与在Chrome控制台中的运行方式似乎存在一些差异

下面是我正在查看的DOM的一部分:

<div class="container">
 <iframe class="rich-text-area" id="EmailMessage">
  #document
   <html>
    <head>
     <link rel="stylesheet" type="text/css" href="/static/css/rich-text-editor.css">
     <link rel="stylesheet" type="text/css" href="/rest/email/css">
     </head>
     <body contenteditable="true"></body>
   </html>
 </iframe>
 <textarea class="code" aria-hidden="true" id="emailSource" style="display: none;">            </textarea>
</div>
知道这是怎么回事吗?我也尝试了
contentDocument.body
。铬和硒的结果相同。我将此用作
sendKeys()
的替代方案,因为我被迫为此测试运行较旧版本的ChromeDriver,该测试破坏了iframes中对
sendKeys()
的支持。我已经用最新的ChromeDriver在我的本地机器上尝试了这段代码,但仍然失败,所以这似乎不是一个环境问题

干杯,
达尔文。

经过进一步调查,我似乎找到了这个问题的答案。问题在于
驱动程序.switchTo()
命令。Chrome控制台在默认页面级别解释代码,Selenium只从
'EmailMessage'
上查看DOM。由于以前使用了
SendKeys()
,这些文件被留在了那里

将行重新排序到以下位置允许使用显式等待检查iframe中的元素,然后在页面级别运行JS。另一个解决方案是将JS字符串更改为从
document.body…
级别开始。我的修正如下:

JavascriptExecutor js = (JavascriptExecutor) driver;
driver.switchTo().frame(emailBodyID);
wait.until(ExpectedConditions.visibilityOfElementLocated(emailBodyTag));
wait.until(ExpectedConditions.elementToBeClickable(emailBodyTag));
driver.switchTo().defaultContent();
js.executeScript("document.getElementById('EmailMessage').contentWindow.document.body.appendChild(document.createTextNode('testText'));");
回过头来看,这相当简单,而且有点明显(虽然不是全部),但是对于任何想要在iframe中使用一些JS切换
SendKeys()
(或者在Selenium中使用iframe执行任何涉及JS和更改作用域的其他操作)的人来说,这可能是一个有点狡猾的问题

JavascriptExecutor js = (JavascriptExecutor) driver;
driver.switchTo().frame(emailBodyID);
wait.until(ExpectedConditions.visibilityOfElementLocated(emailBodyTag));
wait.until(ExpectedConditions.elementToBeClickable(emailBodyTag));
driver.switchTo().defaultContent();
js.executeScript("document.getElementById('EmailMessage').contentWindow.document.body.appendChild(document.createTextNode('testText'));");