再谈异步等待网页加载


我们已经了解到通过
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、网站的结构未来可能会发生变化,导致本节的示例运行失败,但原理基本一样。


 


本页地址:http://www.foxtable.com/webhelp/topics/6998.htm