繁体   English   中英

调用ChromeDriver.Navigate()时出现C#硒SocketException?

[英]C# selenium SocketException when calling ChromeDriver.Navigate()?

我开始使用Selenium并不是很多。 我正在编写一个WPF应用程序,该应用程序应自动在此站点上查找一本书,然后在ListView上显示结果。 起初一切都很好,当我决定再次搜索时就会出现问题。 每次按下搜索按钮,我都会调用WebDriver的Navigate()。GoToUrl()方法,并且在第一次之后,如果再次按下它,我会得到:

OpenQA.Selenium.WebDriverException: 'Unexpected error. System.Net.WebException: Impossible to connect with the remote server. ---> System.Net.Sockets.SocketException: Impossible to estabilish a connection. Persistent refusal of the computer 127.0.0.1:52601

in System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)

in System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)

--- Fine della traccia dello stack dell'eccezione interna ---

in System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)

in System.Net.HttpWebRequest.GetRequestStream()

in OpenQA.Selenium.Remote.HttpCommandExecutor.Execute(Command commandToExecute)

in OpenQA.Selenium.Remote.DriverServiceCommandExecutor.Execute(Command commandToExecute)

那是我的MainWindow类,其中的所有操作都已完成:

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Input;
using System.Xml;
using System.IO;
using System.Net;
using System.Windows.Controls;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System.Threading;

namespace MyLibrary
{
    /// <summary>
    /// Logica di interazione per MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Catalog catalog;
        List<Category> categories;
        XmlDocument catalogXml;
        string xmlPath;

        ChromeDriver resultFinder;
        Thread resultFinderThread;
        string searchName;

        struct ResultViewListItem
        {
            public string N { get; set; }
            public string Result { get; set; }
        }

        public MainWindow()
        {
            InitializeComponent();

            LoadCatalog();
            LoadResultFinder();
        }

        private void LoadCatalog()
        {
            categories = new List<Category>();

            xmlPath = "C:/Users/Andrea Ferrando/Documents/Visual Studio 2017/Projects/Andrea/MyLibrary/MyLibrary/Catalog/catalog.xml";
            catalogXml = new XmlDocument();

            catalogXml.Load(xmlPath);

            foreach(XmlNode node in catalogXml.DocumentElement.ChildNodes)
            {
                categories = getCategories(categories, node);
            }

            catalog = new Catalog(categories, catalogXml, xmlPath);
        }

        private List<Category> getCategories(List<Category> categories, XmlNode node)
        {
            int number = Int32.Parse(node.Attributes["number"].Value);
            string description = node.Attributes["description"].Value;

            Category category = new Category(number, description, categories);
            categories.Add(category);

            if(node.HasChildNodes)
            {
                foreach (XmlNode child in node.ChildNodes)
                {
                     category.Children = getCategories(category.Children, child);
                }

                return categories;
            }

            return categories;
        }

        private void LoadResultFinder()
        {
            ChromeOptions chromeOptions = new ChromeOptions();
            chromeOptions.AddArgument("--window-position=-32000,-32000");

            ChromeDriverService chromeDriverService = ChromeDriverService.CreateDefaultService();
            chromeDriverService.HideCommandPromptWindow = true;

            resultFinder = new ChromeDriver(chromeDriverService, chromeOptions);

            searchName = "";
        }

        private void Grid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            if(e.Source.Equals(FindName("Search")))
            {
                TextBox textBox = (TextBox)FindName("SearchBox");

                searchName = textBox.Text;

                resultFinderThread = new Thread(new ThreadStart(findResults));
                resultFinderThread.Start();
            }
        }

        private void findResults()
        {
            using (resultFinder)
            {
                resultFinder.Navigate().GoToUrl("http://www.sbn.it/opacsbn/opac/iccu/free.jsp");

                IWebElement inputField = resultFinder.FindElementByName("item:1016:Any");
                inputField.SendKeys(searchName);

                IWebElement submitField = resultFinder.FindElementByName("Invia");
                submitField.Click();

                IWebElement table = resultFinder.FindElementById("records");
                IList<IWebElement> trElements = table.FindElements(By.TagName("tr"));
                IList<IWebElement> tdElements;
                List<string> information = new List<string>();

                foreach (IWebElement trElement in trElements)
                {
                    tdElements = trElement.FindElements(By.TagName("td"));

                    information.Add(tdElements[2].Text);
                }

                Dispatcher.Invoke(() =>
                {
                    ListView listView = (ListView)FindName("ResultsList");

                    for (int i = 0; i < information.Count; i++)
                    {
                        listView.Items.Add(new ResultViewListItem { N = (i + 1).ToString(), Result = information[i] });
                    }
                });
            }
        }
    }
}

重要的方法是FindResults(),我希望我已经足够清楚了,在此先感谢您。

我猜您第二次打电话时您的连接已经关闭。

我猜你也在两次调用方法findResults()

问题是您正在使用using语句。 退出代码块后,该语句将释放连接。 答案中,您可以找到有关其工作方式的更多信息。

在完成使用对象之前,请勿处置该对象。 我将删除using开始,然后使用其他技术来处理该对象。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM