我正在尝试处理Selenium中异步函数的完成。 异步js函数必须在点击按钮后启动才能执行。
假设listenFor(arguments[0])
侦听点击处理程序执行的结束,并在调度click action
之前开始侦听它。在下一个函数中,我在使用 C# 的异步/等待Click action
之前侦听单击事件。
private async void ExecuteJsAsync(IActionElement button)
{
Console.WriteLine("Started async function");
var result = Task<bool>.Factory.StartNew(() =>
{
Console.WriteLine("Started to listen");
var script = "listenFor(arguments[0])";
var executor = (IJavaScriptExecutor)browser;
return executor.ExecuteAsyncScript(script);
});
Console.WriteLine("Before click");
new Actions(browser).Click(button).Perform();
Console.WriteLine("After click");
_result = await result;
}
但是我正在获得下一个日志序列:
1. Started async function
2. Before Click
3. Started to listen
在这里我们可以看到Click
操作尚未调度。问题是:
- 是否可以使用Selenium异步执行多个任务(此处为
Click action
和listener
(? - 为什么Selenium不能在这里向浏览器发送
Click action
? - 像
Click
这样的 Selenium 命令SendKeys
在主 javascripts 线程中执行吗?
恕我直言,如果逻辑是这样的:
异步js函数必须在点击按钮后启动才能执行。
然后你需要做一些类似链的事情:
await Task.Run(() => { new Actions(browser).Click(button).Perform(); }).ContinueWith((_task) => { async code to execute AFTER Click (Perform method completion?) })
抱歉,还不知道硒的内在逻辑,所以不确定它是否可行。