慕碼人2483693
2022-08-03 16:03:00
總結我想找出一種方法,使用 's 將標簽添加到 DOM 的頭部,或者任何其他方法都可以。<script>SeleniumJavascriptExecutor我嘗試了很多方法,也發現了一些類似的主題,但沒有一個解決了我的問題,這就是為什么我覺得有必要在這里問它。例如:這個問題中建議的解決方案并沒有解決我的問題。有些人說這對他們有用,但不,它不適合我。我一直在嘗試執行什么?以下是我要執行的代碼的小片段: WebDriver driver = new FirefoxDriver(); JavascriptExecutor jse = (JavascriptExecutor) driver; jse.executeScript("var s = document.createElement('script');"); jse.executeScript("s.type = 'text/javascript';"); jse.executeScript("s.text = 'function foo() {console.log('foo')}';"); jse.executeScript("window.document.head.appendChild(s);");我只是跳過了上面的代碼,您可以使用等導航到網頁,然后嘗試執行腳本。driver.get()另外,將包含我想使用的實際腳本,所以我只是放了一個函數來給出這個想法。s.textfoo()上面的代碼會在您運行它時引發此錯誤:Exception in thread "main" org.openqa.selenium.JavascriptException: ReferenceError: s is not defined到目前為止,我已經嘗試了在互聯網上找到的所有可能的解決方案,但似乎沒有一個有效。
2 回答

達令說
TA貢獻1821條經驗 獲得超6個贊
OP提出了以下解決方案:
jse.executeScript("var s=window.document.createElement('script');" +
"s.type = 'text/javascript';" + "s.text = function foo() {console.log('foo')};" +
"window.document.head.appendChild(s);");

慕森卡
TA貢獻1806條經驗 獲得超8個贊
首先,此行無效。
jse.executeScript("s.text = 'function foo() {console.log('foo')}';");
請注意如何將單引號文本括在單引號中。將一個集合用作“\””
我個人會通過做(編輯使其成為全局函數)來做到這一點:
using OpenQA.Selenium.Support.Extensions; driver.ExecuteJavascript("window.foo = function foo() {console.log('foo')}");
就這么簡單。您正在通過執行此操作將 foo 注冊為方法。執行此javascript后,您可以手動進入瀏覽器開發人員工具并調用“foo()”進行檢查。此外,您可以通過直接在控制臺中注冊來檢查這一點。只需在瀏覽器控制臺中輸入“function foo() {console.log('foo')}”,然后調用“foo()”。
無需將其添加為腳本標記。
編輯#2:我修復了上面的代碼建議,以便將方法分配給窗口,從而可以全局訪問,并且在javascript執行器運行代碼的匿名腳本之外。這不起作用的原始問題已通過此解決,至少在我對它的測試中。
添加回答
舉報
0/150
提交
取消