我正在制作一个片段,将数据发送到分析它的网站,然后发回结果。
有什么方法可以让我的 GetAsych 等到网站完成计算后再获得“完整响应”?
Ps:await 不会知道请求的页面是否包含任何异步处理(例如:xhr 调用)- 我已经使用await
并且ReadAsByteArrayAsync()/ReadAsStringAsync()
谢谢!
我正在制作一个片段,将数据发送到分析它的网站,然后发回结果。
有什么方法可以让我的 GetAsych 等到网站完成计算后再获得“完整响应”?
Ps:await 不会知道请求的页面是否包含任何异步处理(例如:xhr 调用)- 我已经使用await
并且ReadAsByteArrayAsync()/ReadAsStringAsync()
谢谢!
您将需要像Selenium这样的东西,不仅要获取网站的 HTML,还要完全呈现页面并执行任何动态脚本。
然后,您可以挂钩一些事件,等待某些 DOM 元素出现或等待一段时间,直到页面完全初始化。
之后您可以使用 Selenium 的 API 访问 DOM 并提取您需要的信息。
示例代码:
using (var driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)))
{
driver.Navigate().GoToUrl(@"https://automatetheplanet.com/multiple-files-page-objects-item-templates/");
var link = driver.FindElement(By.PartialLinkText("TFS Test API"));
var jsToBeExecuted = $"window.scroll(0, {link.Location.Y});";
((IJavaScriptExecutor)driver).ExecuteScript(jsToBeExecuted);
var wait = new WebDriverWait(driver, TimeSpan.FromMinutes(1));
var clickableElement = wait.Until(ExpectedConditions.ElementToBeClickable(By.PartialLinkText("TFS Test API")));
clickableElement.Click();
}
来源:https ://www.automatetheplanet.com/webdriver-dotnetcore2/
您在这里寻找的是await
operator。根据文档:
await 运算符暂停对封闭 async 方法的评估,直到其操作数表示的异步操作完成。
在对象的上下文中使用示例HttpClient
:
public static async Task Main()
{
// send the HTTP GET request
var response = await httpClient.GetAsync("my-url");
// get the response string
// there are other `ReadAs...()` methods if the return type is not a string
var getResult = response.Content.ReadAsStringAsync();
}
请注意,包含await
-ed 代码的方法被标记为async
并且返回类型为Task
(Task<T>
也可以使用,具体取决于您的需要)。