如何让Invoke-WebRequest等待任务完成或主动更新以获取测速结果
解决通过PowerShell调用speedtest.net测速无结果的问题
问题根源
speedtest.net的测速过程依赖前端JavaScript动态执行,Invoke-WebRequest只能抓取页面初始静态HTML,无法等待JS完成测速并更新DOM后的内容,所以你拿不到带测速结果的元素。另外你之前的提取代码逻辑有误——$site.content是纯字符串,不能直接用Where-Object筛选class属性。
可行解决方案
方案1:用Selenium模拟浏览器(推荐)
Selenium可以模拟真实浏览器行为,等待JS执行完毕后抓取结果,步骤如下:
- 先安装Selenium模块:
Install-Module -Name Selenium -Force
- 下载对应浏览器的驱动(比如ChromeDriver),确保驱动路径在系统环境变量中,或者在脚本里指定路径。
- 编写测速脚本:
# 导入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
相关产品推荐
相关产品推荐

