2017-08-24 101 views
0

我想处理Selenium中异步函数的完成。 异步js函数必须在点击按钮后开始执行。Selenium中的WebDriver的异步命令

listenFor(arguments[0])侦听点击处理程序执行的结束,并在调度click action之前开始侦听它。在下一个函数中,我使用C#的async/await在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行动没有分派。而问题是:

  1. 是否可以执行多个任务异步硒(这里Click action & listener)?
  2. 为什么Selenium无法将Click action发送到浏览器?
  3. Selenium命令如ClickSendKeys在主javascripts线程中执行吗?

回答

0

恕我直言,如果逻辑是这样的:

异步js函数必须启动按钮点击后执行。

,那么你需要做的像一个链条:

await Task.Run(() => { new Actions(browser).Click(button).Perform(); }).ContinueWith((_task) => { async code to execute AFTER Click (Perform method completion?) }) 

对不起,不知道还没有关于硒的内在逻辑,所以不知道它是可行的。