我在做什么我試圖在頁面加載后執(zhí)行的 javascript 中調(diào)用一些基本的東西。我正在為 Selenium 做這件事。為什么?我聽到你在問,這是因?yàn)槲艺谥谱饕粋€(gè)簡單的等待工具,如果點(diǎn)擊或以其他方式“使用”網(wǎng)頁元素導(dǎo)致所述頁面重新加載,它會(huì)一直等到頁面加載完畢。這個(gè)“工具”只是使用 main 之外的一個(gè)線程來嘗試 webelement,等待它的引用變舊,并等待 javascript 中的“onload 事件”發(fā)生。如果這兩件事發(fā)生在某個(gè)超時(shí)條件之前,那么我知道 A: webelement 會(huì)導(dǎo)致頁面重新加載,而 B: 我已經(jīng)適當(dāng)?shù)氐却撁嬷匦录虞d。這很有用,因?yàn)槲铱梢酝ㄟ^編程確定給定的 webelement 是否會(huì)導(dǎo)致頁面重新加載,只需嘗試它并自動(dòng)等待它。問題為了做到這一點(diǎn),我需要在 java 中運(yùn)行一個(gè) javascript onload 事件。我是 javascript 新手,但我研究了 java 附帶的 ScriptEngine API。我決定使用它并嘗試在 onload 事件發(fā)生時(shí)運(yùn)行一個(gè)簡單的 javascript 函數(shù)。問題是我不斷收到“窗口”未定義異常。由于我用來運(yùn)行 javascript 的 ScriptEngine 對(duì)象只接受我正在運(yùn)行的字符串,因此我無法很好地檢查錯(cuò)誤。我試過的我已經(jīng)嘗試研究有關(guān)此錯(cuò)誤的文檔并在堆棧溢出周圍進(jìn)行谷歌搜索,但我似乎無法找到一個(gè)以 Java 為中心的答案,也找不到一個(gè)對(duì)我來說解釋得足夠好的答案。我從研究中收集到的所有信息是,我可能需要將 URL 指定為 window 對(duì)象或其他內(nèi)容,但其他來源讓我相信,如果我使用的是瀏覽器窗口,則應(yīng)該已經(jīng)定義了 window 對(duì)象。我不知道該相信什么。有問題的代碼是:WebDriverWait wait = new WebDriverWait(driver, timeoutSeconds);//initialize a wait for a page to reloadtry { //wait untill our element we clicked is stale wait.until(ExpectedConditions.stalenessOf(webElement)); //try running javascript to do something (here i tried a popup) //later I want this code to wait until the page is loaded and //then send something BACK to the javacode that I can wait for //so that Basically I wait until the page onload event has fired ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine javascript = manager.getEngineByName("javascript"); try { javascript.eval("window.addEventListener('load', function() {" + " alert(ok); " + "})"); } catch (ScriptException e) { e.printStackTrace(); System.out.println("javascript thing failed"); }} 請(qǐng)注意,此代碼位于與 main 一起運(yùn)行的線程內(nèi)。簡單的目的是等到我們點(diǎn)擊的元素失效并且頁面 onload 事件被觸發(fā)。如果這兩件事都沒有發(fā)生,我們單擊的 webelement 不會(huì)導(dǎo)致頁面重新加載。如果元素變得陳舊,我們知道元素發(fā)生了變化,但頁面不會(huì)重新加載。如果這兩件事都發(fā)生了,那么我們就知道 webelement 會(huì)重新加載頁面。一切都在適當(dāng)?shù)氐却?zhǔn)備好找到下一個(gè) webelement。這對(duì) Selenium 很有用,因?yàn)槲也槐負(fù)?dān)心頁面重新加載或刪除自身但不重新加載頁面的元素或任何其他可能導(dǎo)致 StaleReference 異常在不應(yīng)該拋出時(shí)拋出的奇怪邊緣情況。
1 回答

繁星coding
TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
在ScriptEngineManager執(zhí)行JVM僅JavaScript,而不是瀏覽器。
但是“窗口”是瀏覽器中的全局變量,而不是 JVM。這就是為什么你得到window is undefined.
您應(yīng)該使用executeScript()Selenium api 在瀏覽器中執(zhí)行 javascript。
String script = "window.addEventListener('load', function() {" +
" alert('ok'); " +
"})";
JavascriptExecutor js =(JavascriptExecutor)driver;
js.executeScript(script);
添加回答
舉報(bào)
0/150
提交
取消