我在做什么
我试图在页面加载后执行的 javascript 中调用一些基本的东西。我正在为 Selenium 做这件事。为什么?我听到你在问,这是因为我正在制作一个简单的等待工具,如果点击或以其他方式“使用”网页元素导致所述页面重新加载,它会一直等到页面加载完毕。这个“工具”只是使用 main 之外的一个线程来尝试 webelement,等待它的引用变旧,并等待 javascript 中的“onload 事件”发生。如果这两件事发生在某个超时条件之前,那么我知道 A: webelement 会导致页面重新加载,而 B: 我已经适当地等待页面重新加载。这很有用,因为我可以通过编程确定给定的 webelement 是否会导致页面重新加载,只需尝试它并自动等待它。
问题
为了做到这一点,我需要在 java 中运行一个 javascript onload 事件。我是 javascript 新手,但我研究了 java 附带的 ScriptEngine API。我决定使用它并尝试在 onload 事件发生时运行一个简单的 javascript 函数。问题是我不断收到“窗口”未定义异常。由于我用来运行 javascript 的 ScriptEngine 对象只接受我正在运行的字符串,因此我无法很好地检查错误。
我试过的
我已经尝试研究有关此错误的文档并在堆栈溢出周围进行谷歌搜索,但我似乎无法找到一个以 Java 为中心的答案,也找不到一个对我来说解释得足够好的答案。我从研究中收集到的所有信息是,我可能需要将 URL 指定为 window 对象或其他内容,但其他来源让我相信,如果我使用的是浏览器窗口,则应该已经定义了 window 对象。我不知道该相信什么。有问题的代码是:
WebDriverWait wait = new WebDriverWait(driver, timeoutSeconds);
//initialize a wait for a page to reload
try {
//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");
}
}
请注意,此代码位于与 main 一起运行的线程内。简单的目的是等到我们点击的元素失效并且页面 onload 事件被触发。如果这两件事都没有发生,我们单击的 webelement 不会导致页面重新加载。如果元素变得陈旧,我们知道元素发生了变化,但页面不会重新加载。如果这两件事都发生了,那么我们就知道 webelement 会重新加载页面。一切都在适当地等待,并准备好找到下一个 webelement。这对 Selenium 很有用,因为我不必担心页面重新加载或删除自身但不重新加载页面的元素或任何其他可能导致 StaleReference 异常在不应该抛出时抛出的奇怪边缘情况。
繁星coding
相关分类