我正在编写一个程序,可以帮助我的客户从网站下载发票PDF,第一次使用drv.Navigate().GoToUrl(URL);时一切正常。此后,程序会休眠一段时间,当清醒时开始搜索我的客户的电子邮件(使用S22 DLL),如果他找到了某个电子邮件,则从该电子邮件中提取链接并使用(第二次使用)drv.Navigate().GoToUrl(URL);。但是这次我例外


  浏览上下文已被丢弃


我已经尝试了所有可能的方法,但是最“令人震惊”的事情是我在Google上找不到关于此错误的任何信息,也没有在Selenium文档中找到任何信息。

我不明白这意味着什么

我确定该链接有效,因为是同一链接。

下面的代码受此问题影响

P.S:第一次下载与第二次下载完全相同。

    public static int Go(string URL, ImapClient EmailClient, uint mUID, bool isFromOutlook) {
    // While the Firefox driver isn't initialized, wait for it
    while (isDrvInit != 1 && isDrvInit != 2)
        Thread.Sleep(1);
        // If the Firefox driver was not able to initialize, we can't procede further
    if (isDrvInit == 2)
        return 0;

    try {
        drv.Navigate().GoToUrl(URL); // Here the program throw the exception

        if (isLoginPage()) {
            if (!Login()) {
                if (Internet.IsAvailable()) {
                    Error.Show(Error.Code.MOBILCOM_LOGIN, Error.Status.F, Error.Type.DEFAULT,
                              "Unable to log-in to the Mobilcom account... Are the e-mail/password in the config file correct?");
                    } else {
                        Error.Show(Error.Code.FIREFOX_CANT_NAVIGATE, Error.Status.W, Error.Type.DEFAULT, String.Format(
                                  "Can't connect to Mobilcom because Internet connection is missing...", drv.Url));
                    }

                     return 0;
            } else {
                Error.Show(Error.Code.MOBILCOM_LOGIN, Error.Status.S, Error.Type.DEFAULT,
                           "Successfully logged to the Mobilcom account!");

                if (GetPdfInvoice() == true) {
                    if (isFromOutlook) {
                        MailMessage _m = EmailClient.GetMessage(mUID, true, Global.outlookSpecialFolder);

                        Error.Show(Error.Code._DEFAULT, Error.Status.S, Error.Type.OUTLOOK, String.Format(
                                  "PDF Invoice: Subject: [{0}] | Downloaded from the link '{1}' successfully saved! :)",
                                   _m.Subject, drv.Url));
                        } else {
                            MailMessage _m = EmailClient.GetMessage(mUID, true, Global.gmailSpecialFolder);

                            Error.Show(Error.Code._DEFAULT, Error.Status.S, Error.Type.GMAIL, String.Format(
                                       "PDF Invoice: Subject: [{0}] | Downloaded from the link '{1}' successfully saved! :)",
                                        _m.Subject, drv.Url));
                        }
                } else {
                    if (!Internet.IsAvailable()) {
                        Error.Show(Error.Code.MOBILCOM_NO_INTERNET, Error.Status.W, Error.Type.DEFAULT, String.Format(
                                   "Can't download the PDF Invoice from '{0}' because Internet connection is missing!",
                                    drv.Url));
                        } else {
                            Error.Show(Error.Code.MOBILCOM_CANT_D_PDF, Error.Status.F, Error.Type.DEFAULT, String.Format (
                                      "Unknow Exception: Can't download the PDF Invoice from '{0}', retrying to download next time...",
                                       drv.Url));
                        }
                }

                CloseUnnecessaryTabs();
            }
        } else {
        // Still nothing
        }

        return 1;
    } catch {
        if (!Internet.IsAvailable()) {
            Error.Show(Error.Code.FIREFOX_CANT_NAVIGATE, Error.Status.W, Error.Type.DEFAULT, String.Format(
                      "Unable to continue on Mobilcom because Internet connection is missing, retrying to download next time..."));
        } else {
            Error.Show(Error.Code.FIREFOX_CANT_NAVIGATE, Error.Status.F, Error.Type.DEFAULT, String.Format(
                      "Unknow Exception: Unable to reach the '{0}' URL", drv.Url));
        }

        CloseUnnecessaryTabs();
        return 0;
    }
}


[编辑]

CloseUnnecessaryTabs()代码关闭每个打开的选项卡,仅保留一个选项卡以避免Firefox被关闭

private static void CloseUnnecessaryTabs() {
                if (drv.WindowHandles.Count > 1) {
                    for (int i = drv.WindowHandles.Count - 1; i > 0; i--) {
                        drv.SwitchTo().Window(drv.WindowHandles[i]);
                        drv.Close();
                    }
                }
            }

最佳答案

我在代码中发现了导致此异常的错误。

关闭完不必要的选项卡后,我忘记了切换回“主”选项卡,我解决了在drv.SwitchTo().Window(drv.WindowHandles[0]);代码中添加CloseUnnecessaryTabs()的问题。

private static void CloseUnnecessaryTabs() {
                if (drv.WindowHandles.Count > 1) {
                    for (int i = drv.WindowHandles.Count - 1; i > 0; i--) {
                        drv.SwitchTo().Window(drv.WindowHandles[i]);
                        drv.Close();
                    }
                }

                drv.SwitchTo().Window(drv.WindowHandles[0]); // <-- The solution
            }


我发现了一个“提示” here


  每个浏览上下文都有一个已知元素的关联列表。当浏览上下文被丢弃时,已知元素的列表将与之一起被丢弃。

07-26 08:57