0

It's not been a lot that I started using Selenium. I'm writing a WPF application that should automatically look for a book on this site and then represent the results on a ListView. Everything's fine at first, the problem comes up when I decide to search a second time. Every time a press the search button I call the Navigate().GoToUrl() method of WebDriver, and after the first time, if I press it again I get this:

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)

That's my MainWindow class, where everything is done:

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] });
                    }
                });
            }
        }
    }
}

The important method is FindResults() I hope I've been clear enough, thanks in advance.

1 Answers1

2

I would guess your connection is close somehow the second time you call it.

I guess also you are calling tow times the method findResults().

The problem is that you are using the using statement. This statement disposes the connection once the code block is exited. In this answer you can find more information about how it works.

You should not Dispose the object until you have finish using it. I would delete the using for starting, then I would use some other technique to dispose the object.

Hope this helps.

Community
  • 1
  • 1
AxelWass
  • 1,321
  • 12
  • 21