1

我在 VS 2019 中构建了一个 C# windows 窗体应用程序,其中包括 Webview2(最新预发行版)来创建浏览器。应用程序加载页面并检查特定内容。如果内容不存在,它会重新加载页面。如果内容在那里(尚未发生),它会填写一些字段并单击一个按钮。

该应用程序运行良好一段时间。现在每隔一段时间我就会在 Webview2 控件中得到以下信息:

此页面有问题。请稍后再回来

您还可以: 打开一个新选项卡 刷新页面

错误代码:STATUS_ACCESS_VIOLATION

我在调试模式下运行应用程序以尝试捕获错误。捕捉也不例外。如果我在控件的ContentLoading事件中放置一个断点Webview2,它在我看到这个错误页面之前永远不会触发。我不确定是什么触发了它或如何阻止它。

在 Form_load 我调用以下内容:

async void checksites()
{
    await wv2Dig.EnsureCoreWebView2Async();
    wv2Dig.CoreWebView2.Navigate(strURL);
}

并且ContentLoading会调用下面的函数来尝试在页面加载时检查内容,以便在页面完全加载之前做出决定。现在它只是触发我们不想要的按钮。这是代码:

async Task DigPageCheck()
        {
            iDigCount += 1; //count of number of checks
            txtDig.Text = iDigCount.ToString(); //display count

            string strResult = await wv2Dig.CoreWebView2.ExecuteScriptAsync("document.documentElement.innerHTML;");  
            //get innerHTML
            strResult = Regex.Unescape(strResult);
            strResult = strResult.Remove(0, 1);
            strResult = strResult.Remove(strResult.Length - 1, 1);
            //check for button we want
            int loc = strResult.IndexOf("btn btn-primary btn-lg btn-block btn-leading-ficon add-to-cart-button"); 
            //check for button we want
            int loc2 = strResult.IndexOf("btn btn-disabled btn-lg btn-block add-to-cart-button"); x
            while (loc == -1 && loc2 == -1)
            {
                //while neither button exists wait and check again
                await Task.Delay(200);
                strResult = await wv2Dig.CoreWebView2.ExecuteScriptAsync("document.documentElement.innerHTML;");
                strResult = Regex.Unescape(strResult);
                strResult = strResult.Remove(0, 1);
                strResult = strResult.Remove(strResult.Length - 1, 1);
                loc = strResult.IndexOf("btn btn-primary btn-lg btn-block btn-leading-ficon add-to-cart-button");
                loc2 = strResult.IndexOf("btn btn-disabled btn-lg btn-block add-to-cart-button");

            }
            //the button we want has been found 
            if (loc != -1)
            {
                iDig += 1;
                string mSubj = "Found";
                try
                {
                    sendSMS(mSubj, strDigURL);
                }
                catch
                {
                    label3.Text = "Email Error";
                }
                var functionString = string.Format(@"document.getElementsByClassName('btn btn-primary btn-lg btn-block btn-leading-ficon add-to-cart-button')[0].click();");
                await wv2Dig.CoreWebView2.ExecuteScriptAsync(functionString);
                
            }
            else //button we don't want found
            {
                if (bRun) //app is in run state, it can be paused
                    wv2Dig.CoreWebView2.Reload(); //Reload the page and check again
            }
        }

似乎在重新加载时出现了错误页面。

通过删除 WebView2 prelease 0.9.682 并安装 prerelease 0.9.579 解决了以下问题

我有一个随机弹出的新问题。应用程序冻结await wv2Dig.EnsureCoreWebView2Async();在一个调用的函数中Form_Load

4

1 回答 1

1

wv2Dig.CoreWebView2.Stop()在做之前添加了一个wv2Dig.CoreWebView2.Reload(),从那以后我就没有看到这个问题。我认为这可能已经解决了问题。我说我认为是因为程序运行了很长一段时间没有问题,然后开始出现问题。

在此过程中,我还降级了 WebView2 的预发布版本,因为 WebView2 以某种方式完全停止工作。

于 2020-10-17T01:55:37.073 回答