【问题标题】:How to make an HttpClient GetAsync wait for a webpage that loads data asynchronously?如何让 HttpClient GetAsync 等待异步加载数据的网页?
【发布时间】:2020-11-04 14:15:36
【问题描述】:

我正在制作一个 sn-p,它将数据发送到网站,网站对其进行分析,然后发回结果。

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

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

谢谢!

【问题讨论】:

    标签: .net-core httpclient getasync


    【解决方案1】:

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

    【讨论】:

    • 我试试看!没想到硒!
    • 如果有帮助,请不要忘记给答案投票。@SoufianeTahiri
    【解决方案2】:

    您在这里寻找的是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 并且返回类型为TaskTask<T> 也可以工作,具体取决于您的需要)。

    【讨论】:

    • 不行,这行不通! await 不会知道请求的页面是否包含任何异步处理(例如:xhr 调用)
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2019-06-14
    • 2012-02-08
    • 2020-09-02
    • 1970-01-01
    相关资源
    最近更新 更多