![](/img/trans.png)
[英]Selenium JavaScript Executor returns null for .checked but works for .click()?
[英]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.