2017-03-27 4 views
0

Ça n'a pas été très souvent que j'ai commencé à utiliser Selenium. J'écris une application WPF qui devrait rechercher automatiquement un livre sur ce site, puis représenter les résultats sur ListView. Tout va bien au début, le problème se pose quand je décide de chercher une seconde fois. Chaque fois qu'un appuyez sur le bouton de recherche que j'appelle la méthode Navigate() gotoUrl() de WebDriver, et après la première fois, si je presse à nouveau je reçois ceci:.C# sélénium SocketException lors de l'appel de ChromeDriver.Navigate()?

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) 

C'est ma classe MainWindow, où tout est fait:

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

La méthode est importante FindResults() J'espère avoir été assez clair, merci à l'avance.

Répondre

2

Je suppose que votre connexion est proche de la deuxième fois que vous l'appelez.

Je suppose aussi que vous appelez les temps de remorquage la méthode findResults(). Le problème est que vous utilisez l'instruction using. Cette instruction élimine la connexion une fois le bloc de code quitté. Dans this répondre, vous pouvez trouver plus d'informations sur la façon dont cela fonctionne.

Vous ne devez pas jeter l'objet tant que vous n'avez pas fini de l'utiliser. Je voudrais supprimer le using pour le démarrage, alors je voudrais utiliser une autre technique pour disposer de l'objet.

Espérons que cela aide.

+1

Merci beaucoup! Ça a vraiment marché !!! –