2017-03-27 3 views
0

私はセレンを使い始めたことはあまりありませんでした。私はこのサイトの本を自動的に探して、ListViewで結果を表現するWPFアプリケーションを作成しています。最初はすべてうまくいっていますが、2回目の検索をするときに問題が発生します。私のメインウィンドウクラスは、すべてのですChromeDriver.Navigate()を呼び出すと、C#セレニウムSocketExceptionが発生しますか?

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) 

:たびプレス検索ボタンは、私がwebdriverをの移動()GoToUrl()メソッドを呼び出して、私は再びそれを押すと、最初の時間の後、私はこれを取得。行われます。

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() 私は事前に、私は十分に明らかにされてきた感謝を期待しています。

答えて

2

私はあなたの接続が何とかあなたがそれをもう一度呼び出すときに近いと思います。

また、私は、あなたは、方法findResults()を曳航していると思います。

問題は、usingステートメントを使用していることです。このステートメントは、コードブロックが終了すると接続を破棄します。 this答えでは、それがどのように機能するかについての詳細情報があります。

使用を終了するまで、オブジェクトを廃棄しないでください。私は開始するためにusingを削除します、そして、私はオブジェクトを処分するためにいくつかの他のテクニックを使用します。

これが役に立ちます。

+1

ありがとうございました!それは本当に働いた! –

関連する問題