0

我正在制作一个片段,将数据发送到分析它的网站,然后发回结果。

有什么方法可以让我的 GetAsych 等到网站完成计算后再获得“完整响应”?

Ps:await 不会知道请求的页面是否包含任何异步处理(例如:xhr 调用)- 我已经使用await并且ReadAsByteArrayAsync()/ReadAsStringAsync()

谢谢!

4

2 回答 2

2

您将需要像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/

于 2020-11-04T14:59:23.583 回答
0

您在这里寻找的是awaitoperator。根据文档:

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>也可以使用,具体取决于您的需要)。

于 2020-11-04T14:49:46.080 回答