You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Invoke-WebRequest等待任务完成或主动更新以获取测速结果

解决通过PowerShell调用speedtest.net测速无结果的问题

问题根源

speedtest.net的测速过程依赖前端JavaScript动态执行,Invoke-WebRequest只能抓取页面初始静态HTML,无法等待JS完成测速并更新DOM后的内容,所以你拿不到带测速结果的元素。另外你之前的提取代码逻辑有误——$site.content是纯字符串,不能直接用Where-Object筛选class属性。

可行解决方案

方案1:用Selenium模拟浏览器(推荐)

Selenium可以模拟真实浏览器行为,等待JS执行完毕后抓取结果,步骤如下:

  1. 先安装Selenium模块:
Install-Module -Name Selenium -Force
  1. 下载对应浏览器的驱动(比如ChromeDriver),确保驱动路径在系统环境变量中,或者在脚本里指定路径。
  2. 编写测速脚本:
# 导入Selenium模块
Import-Module Selenium

# 启动Chrome浏览器实例
$driver = Start-SeChrome

# 打开speedtest.net主页
Enter-SeUrl -Driver $driver -Url "https://www.speedtest.net/"

# 等待开始按钮加载完成并点击
$startButton = Wait-SeElement -Driver $driver -By ClassName -Value "start-text" -Timeout 10
Invoke-SeClick -Driver $driver -Element $startButton

# 等待测速完成(最长等待60秒),直到下载结果元素出现
Wait-SeElement -Driver $driver -By ClassName -Value "download-speed" -Timeout 60

# 提取下载、上传速度结果
$downloadSpeed = (Get-SeElement -Driver $driver -By ClassName -Value "download-speed").Text
$uploadSpeed = (Get-SeElement -Driver $driver -By ClassName -Value "upload-speed").Text

# 输出测速结果
Write-Host "下载速度: $downloadSpeed"
Write-Host "上传速度: $uploadSpeed"

# 关闭浏览器
Stop-SeDriver -Driver $driver

方案2:调用Ookla公开API(需处理验证)

如果不想用浏览器,可以尝试调用Ookla的测速API,但该API存在验证机制,实现相对复杂。示例思路:

# 获取就近测速服务器列表
$servers = Invoke-RestMethod -Uri "https://www.speedtest.net/api/js/servers"
# 筛选延迟最低的服务器
$bestServer = $servers | Sort-Object latency | Select-Object -First 1

后续需要按照Ookla的API规则构造测速请求,处理签名等验证步骤,适合有API开发经验的场景。

对你原有脚本的说明

  • 使用-UseBasicParsing会禁用DOM解析,导致$site.Links的准确性受影响,但核心问题还是静态请求无法获取动态生成的测速结果。
  • 你尝试的提取代码$site.content | Where-Object class -icontains ...逻辑错误,因为$site.content是字符串,不存在class属性,即使改用Select-String匹配,静态HTML里也没有测速结果内容。

内容的提问来源于stack exchange,提问作者Derek Jeder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:30:59