再谈异步等待网页加载
我们已经了解到通过NavigateWithWebResourceRequestAsync方法可以实现异步等待网页加载。
但这个方法有个局限,就是必须构造访问请求,也就是必须有明确的目标网址。
但并不是每次都会有明确的目标网址来实现网页跳转的,例如登录窗口是通过单击登录按钮来实现跳转的,还有很多场景是通过单击元素执行js代码来实现跳转的。
为此Foxtable提供了一个通用的NavigationTaskAsync函数,可以用于等待任何形式的异步网页加载,语法:
Await wv.NavigationTaskAsync(timeout)
| timeout | 可选,等待的秒数,默认30秒,如果在设定时间内没有成功加载网页,则退出该方法。 |
返回值说明:
| 0 | 成功加载了网页 |
| 1 | 在timeout参数指定的时间内,没有打开网页,也就是超时。 |
| -1 | 网页加载失败 |
模拟人工登录
本示例可参考示例文件"CaseStudy\WebViewer\网页自动化.Table"的窗口"模拟人工登录"
测试站点:https://quotes.toscrape.com/login
账号:admin
密码:admin
测试代码:
'''Async
Dim
wv
As
WebViewer = e.Form.Controls("WebViewer1").WebViewer
'====================
第1步:自动填写登录表单并登录
====================
Dim
uri
As
String
=
"https://quotes.toscrape.com/login"
Dim
request = wv.CreateWebResourceRequest(uri)
Dim
ret
As
Integer
=
Await
wv.NavigateWithWebResourceRequestAsync(request, 10)
If
ret <> 0
Then
MessageBoxA.Show("登录页面加载失败,终止程序")
Return
End
If
'模拟输入账号
Dim
userInput = wv.querySelector("[name='username']")
userInput.value =
"admin"
'模拟输入密码
Dim
pwdInput = wv.querySelector("[name='password']")
pwdInput.value =
"admin"
Await
Task.Delay(1000)
'延迟1秒,可选,只是为了让用户看到自动输入了账户和密码
'模拟单击登录按钮
Dim
submitBtn = wv.querySelector("[type='submit']")
submitBtn.click()
'====================
第2️步:判断登录是否成功
====================
'这是另一个等到网页加载结束的方法,请务必掌握
ret =
Await
wv.NavigationTaskAsync(10)
If
ret = 0
Then
'注意:即使返回0,也只能表示提交账户和密码后,网页有正常的跳转,并不一定是登录成功!!!
'通常登录成功后,会有特定的页面元素,例如这个系统登录成功后会有logout元素,可以通过判断是否有这个元素来判断登录是否成功
Dim
logoutEle = wv.querySelector("a[href='/logout']")
If
Await
logoutEle.IsNull()
Then
MessageBoxA.Show("登录失败!账号/密码错误或页面异常")
Return
End
If
Else
If
ret = 1
Then
wv.Stop()
'取消继续加载
MessageBoxA.Show("登录超时")
ElseIf
ret = -1
Then
MessageBoxA.Show("登录出错")
End
If
Return
End
If
MessageBoxA.Show("登录成功")
提示:
1、必须先跳转网页,或模拟单击会导致网页跳转的元素,然后再用Await关键词异步等待NavigationTaskAsync函数运行结束
。
2、跳转和等待之间不可以有其他代码!!!
Post自动登录
上一个示例打开了登录页面,模拟人工输入账号密码和单击登录按钮,整个过程和我们人工登录没有差别。
我们也可以不打开登录页面,直接用代码合成登录表单的数据,然后提交登录。
本示例可参考示例文件"CaseStudy\WebViewer\网页自动化.Table"的窗口"POST自动登录"。
测试代码:
'''Async
Dim
wv
As
WebViewer = e.Form.Controls("WebViewer1").WebViewer
Dim
loginUrl
As
String
=
"https://quotes.toscrape.com/login"
'务必查看表单的action属性获得真实的地址
Dim
formData
As
String
=
"username=admin&password=admin"
'包含账号和密码的表单数据
Dim
byteArr
As
Byte()
= System.Text.Encoding.UTF8.GetBytes(formData)
'将表单数据转成字节数组
Dim
stream
As
New
MemoryStream(byteArr)
'将字节数组转换成内存流
'创建POST登录请求
Dim
request = wv.CreateWebResourceRequest(loginUrl,
"POST",
stream)
request.Headers.SetHeader("Content-Type",
"application/x-www-form-urlencoded")
request.Headers.SetHeader("User-Agent",
"Mozilla/5.0 Chrome/126.0.0.0 Safari/537.36")
'可选
'提交登录POST
Dim
ret =
Await
wv.NavigateWithWebResourceRequestAsync(request, 10)
If
ret = 0
Then
MessageBoxA.Show("POST登录成功")
Else
If
ret = 1
Then
wv.Stop()
'取消继续加载
MessageBoxA.Show("POST登录超时")
ElseIf
ret = -1
Then
MessageBoxA.Show("POST登录出错")
End
If
Return
End
If
提示:
1、一般来说,如果需要构造访问请求,用NavigateWithWebResourceRequestAsync函数实现异步等待网页加载,否则用NavigationTaskAsync会更简单。
2、我只是用登录这种最常见的场景来讲述用WebViewer实现自动化操作而已,你要举一反三哦。
3、网站的结构未来可能会发生变化,导致本节的示例运行失败,但原理基本一样。