簡體   English   中英

當JS在Chrome控制台上正常運行時,Selenium JavaScript執行程序返回null

[英]Selenium JavaScript executor returning null when JS works fine on Chrome console

我正在嘗試使用Selenium + ChromeDriver(Java驅動)將一些文本添加到iframe的文本框中,並且在堆棧跟蹤中遇到以下錯誤:

org.openqa.selenium.WebDriverException: unknown error: Cannot read property 'contentWindow' of null

我使用斷點來確保整個DOM都已加載,因此這似乎不是問題。 我還在js.executeScript行的斷點處在Chrome控制台中測試了我的JS,它工作正常。 但是,一旦我一步步完成測試,它就會失敗並顯示相同的錯誤。 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>

在Chrome控制台中運行我的JS時,它是:

document.getElementById('EmailMessage').contentWindow.document.body.appendChild(document.createTextNode('testText'));

我得到的期望結果是在body標簽之間的內部HTML,例如:

<body contenteditable="true">testText</body>

但是,使用以下代碼運行它時,它崩潰了,並給了我上面提到的錯誤。 這是運行此代碼的Java代碼的一部分:

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

知道這里發生了什么嗎? 我也嘗試過contentDocument.body Chrome和Selenium中的結果相同。 我將其用作sendKeys()的替代方法,因為我被迫為此測試運行較舊版本的ChromeDriver,因為它破壞了iframe中對sendKeys()支持。 我已經在本地計算機上使用最新的ChromeDriver嘗試了此代碼,但該代碼仍然失敗,因此似乎不是環境問題。

干杯,達爾文。

經過更多調查,看來我已經找到了答案。 問題出在driver.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()的人(或執行其他任何涉及JS並在Selenium中使用iframe更改范圍的操作),這可能是一個偷偷摸摸的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM