gpt4 book ai didi

javascript - 如何通过 ExecuteScript 添加自己的监听器来捕获 "load"事件?

转载 作者:行者123 更新时间:2023-12-02 16:48:36 31 4
gpt4 key购买 nike

我正在尝试使用 Selenium 捕获 load (不是 onload)事件。

我的代码如下所示(请参阅评论):

// d is my webdriver
// go to url
d.Navigate().GoToUrl(url);
WebDriverWait wait = new WebDriverWait(d, TimeSpan.FromSeconds(30));

// create a function that add an element with id="my_123456789"
string javascript =
"my_readyFCT = function(){"
+ "alert('READY');"
+ "var e = document.createElement('div');"
+ "e.id = 'my_123456789';"
+ "document.body.appendChild(e);"
+ "};"
// call the function once 'load' event is fired
+ "window.addEventListener('load', my_readyFCT, false);"

((IJavaScriptExecutor)d).ExecuteScript(javascript);

// Selenium wait until the element with id "my_123456789" exists
wait.Until<IWebElement>(ExpectedConditions.ElementExists(By.Id("my_123456789")));

我总是遇到超时异常(30 秒),但我看不出我做错了什么。

有什么想法吗?

注意:我尝试自行执行函数my_readyFCT,它创建了插入到 DOM 中的具有正确 ID 的元素。

编辑

这是 JavaScript :

my_readyFCT = function() {
alert('READY');
var e = document.createElement('div');
e.id = 'my_123456789';
document.body.appendChild(e);
};
// call the function once 'load' event is fired
window.addEventListener('load', my_readyFCT, false);

编辑2

我必须说我找到了一种方法来避免 GoToUrl 的常见行为(这是页面加载的方式):

var fb = new FirefoxBinary();
fb.Timeout = TimeSpan.FromMinutes(4);
FirefoxProfile fp = new FirefoxProfile();
// 'unstable' allow us to avoid the implicit wait in GoToUrl
fp.SetPreference("webdriver.load.strategy", "unstable");
d = new FirefoxDriver(fb, fp, TimeSpan.FromMinutes(1));

当我想更改网址时:

d.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(0));
try {
d.Navigate().GoToUrl(url);
}
catch(WebDriverException) /* will be thrown everytime */
{ }

WebDriverWait wait = new WebDriverWait(d, TimeSpan.FromSeconds(30));
/*
* ...
* ETC. See code above
* ...
*/

最佳答案

你想做的事情无法完成。 GoToUrl 的文档(对于 Java 和 Python 以及 Selenium 支持的其他语言来说,它是 get)明确表示它会阻塞“直到加载完成”。

你可以测试一下。采用以下 HTML:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8"/>
<script>
window.addEventListener("load", function () {
window.loaded_inline = true;
});
</script>
</head>
<body>
</body>
</html>

并运行以下 Selenium 脚本。抱歉,我不会 C#,所以这是 Python。应该不会太难理解:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("file:///tmp/t2/index.html") # This gets the page above.

# This checks whether the load handler in the page was called.
print "Inline:", driver.execute_script("return window.loaded_inline")

driver.set_script_timeout(2)

# This is an asynchronous script. It will end when the load event is
# emitted by the browser. Or timeout if the event does not happen.
driver.execute_async_script("""
var done = arguments[0];
window.addEventListener('load', done, false);
""")

driver.quit()

当我执行此操作时,我得到Inline: True,然后超时。您可以根据需要增加超时时间,它永远不会改变结果。

这表明 load 事件发生在 get 返回之前,到那时再向 load 添加更多监听器已经太晚了>.

如何让页面加载立即返回?

它也不起作用。首先,在我看来,您必须将 webdriver.load.strategy 设置为值 unstable 的事实应该是一个线索,也许这不是什么,你知道, 稳定的。该设置是 marked "beta"在文档中。医生还说:

This may cause immediate find's [sic] to break, so please be sure to use an implicit or explicit wait too.

他们谈论的用例是立即加载页面,然后在其上搜索元素。 在 HTML 完全加载之前,此搜索无法完成,这意味着加载已经发生。

如果您在查找元素之前尝试运行脚本,则脚本根本不会执行。

关于javascript - 如何通过 ExecuteScript 添加自己的监听器来捕获 "load"事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26888278/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com