2017-10-17 7 views
0

Voici ce que je voudrais faire via Sélénium WebDriver:C# Sélénium WebDriver attendre quelques éléments pour charger complètement avant d'aller sur

  1. Aller à https://www.for-sale.ie/adidas
  2. Cliquez sur un filtre
  3. Cliquez sur La première annonce après le filtrage est effectuée

Ce qu'il fait à la place est de cliquer sur la première annonce avant le filtrage (toute la page n'est pas rechargée pour le filtrage, juste la liste d'annonces)

var url = "https://www.for-sale.ie/adidas"; 
RemoteWebDriver _driver = new FirefoxDriver(); 
_driver.Manage().Window.Maximize(); 
_driver.Navigate().GoToUrl(url); 

_driver.FindElement(By.CssSelector("#jsFilterItems_2 > ul > li:nth-child(2) > div > label > input")).Click(); 
System.Threading.Thread.Sleep(3000); 
_driver.FindElement(By.CssSelector("article > .box_product_item.art-div > .listview > .middle > h2")).Click(); 

La seule façon que je trouve pour le rendre le travail est d'ajouter une Thread.Sleep qui n'est pas la meilleure solution. J'ai aussi essayé de gérer les délais mais sans succès. Toute suggestion?

+0

Vous devez utiliser ExpectedConditions pour attendre la mise à jour de la page - https://seleniumhq.github.io/selenium/docs/api/dotnet/html/T_OpenQA_Selenium_Support_UI_ExpectedConditions.htm – Grasshopper

+0

Excellent! Je vous remercie! Je vais vous expliquer ce que j'ai fait grâce à votre commentaire. – Gun

Répondre

0

Voici la solution que je trouve par Grasshopper dans le commentaire:

var url = "https://www.for-sale.ie/adidas"; 
_driver = new FirefoxDriver(); 
_driver.Manage().Window.Maximize(); 
_driver.Navigate().GoToUrl(url); 

var firstAd = _driver.FindElement(By.CssSelector("article > .box_product_item.art-div > .listview > .middle > h2")); 

_driver.FindElement(By.CssSelector("#jsFilterItems_2 > ul > li:nth-child(2) > div > label > input")).Click(); 

var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(10)); 
wait.Until(ExpectedConditions.StalenessOf(firstAd)); 

_driver.FindElement(By.CssSelector("article > .box_product_item.art-div > .listview > .middle > h2")).Click(); 

D'abord, je reçois la première annonce de la page (avant filtrage) j'attends cette annonce à ne plus attaché au DOM via la fonction StalenessOf lorsque je clique sur le filtre. Et je peux enfin obtenir l'annonce filtrée.

+0

Vous devriez accepter cela comme une réponse. – IamBatman

+1

Comme c'est ma réponse, je dois attendre 2 jours pour l'observer. Je le ferai demain. – Gun