2015-03-13 22 views
6

Cercando di scrivere alcuni casi di test che utilizzano il selenio WebDriver in C# e hanno uno scenario che io sono sicuro di come risolvereSelenio WebDriver selezionando nuova finestra C#

scenario utente è alla ricerca di un tavolo per un paziente, selezionare un paziente quindi una nuova finestra si apre e quindi asserisce vari elementi sulla finestra

il mio problema è che non riesco a selezionare la nuova finestra per far valere nulla, non è una finestra pop-up, è una finestra del browser completamente nuova ma non ha il titolo/nome della finestra per identificarlo, come potrei essere in grado di cambiare il focus del driver in questa finestra?

grazie in anticipo

+0

si può provare a passare ad esso attraverso le maniglie delle finestre? –

risposta

8

È davvero facile in Selenium WebDriver. Utilizzando il metodo switchto

driver.SwitchTo().Window(driver.WindowHandles.Last()); 

Vedi questo post sul blog, così

http://binaryclips.com/2015/03/13/selenium-webdriver-in-c-switch-to-new-window/

+1

Viene visualizzato questo messaggio di errore: 'System.Collections.ObjectModel.ReadOnlyCollection ' non contiene una definizione per 'Last' e nessun metodo di estensione 'Last' accetta un primo argomento di tipo 'System.Collections.ObjectModel.ReadOnlyCollection 'potrebbe essere trovato (ti manca una direttiva using o un riferimento assembly?) – dmeehan

+2

Si prega di aggiungere questo utilizzando la direttiva nella parte superiore del codice utilizzando System.Linq; Quindi sarete in grado di accedere a tutti i metodi Linq.Enumerables come First(), Last() ecc. – joinsaad

0

Se ho capito correttamente l'applicazione produrrà la finestra su di essa la propria, senza ulteriori userintervention. Dovresti essere in grado di aspettare che la pagina venga caricata e quindi puoi chiamare i tuoi asser come di consueto.

Il selenio ha già la sessione del browser, quindi una nuova finestra non è un problema per il selenio, è solo un nuovo contenuto.

0
foreach (string defwindow in driver.WindowHandles) 
{ 
    driver.SwitchTo().Window(defwindow); 
    if(driver.Title == "") 
    { 
    selenium.WindowFocus(); 
    selenium.SelectWindow(""); 
    } 

}  

"" - indica la finestra del Titolo

0

Ho qualche codice ti avrebbe fatto piacere. La soluzione più rapida è usare Popup Finder, ma ho anche creato il mio metodo. Non farei mai affidamento sull'ordine in cui i manici di Windows sono presenti per selezionare la finestra appropriata. un'altra finestra del Finder:

PopupWindowFinder finder = new PopupWindowFinder(driver); 
driver.SwitchTo().Window(newWin); 

Il mio metodo personalizzato. Fondamentalmente lo passi l'elemento che vuoi cliccare, il tuo webdriver, e opzionalmente il tempo di aspettare prima di cercare dopo aver fatto clic sull'elemento.

Prende tutte le maniglie attuali e crea un elenco. Usa questa lista per eliminare le finestre già esistenti da cui ci si sposta accidentalmente. Quindi fa clic sull'elemento che avvia la nuova finestra. Dovrebbe esserci sempre una sorta di ritardo dopo il clic, poiché nulla accade all'istante. E poi crea una nuova lista e la confronta con quella vecchia fino a quando non trova una nuova finestra o il ciclo scade. Se non riesce a trovare una nuova finestra, restituisce null, quindi se hai un webfinement incerto che non sempre funziona, puoi fare un controllo nullo per vedere se l'interruttore ha funzionato.

public static string ClickAndSwitchWindow(IWebElement elementToBeClicked, 
IWebDriver driver, int timer = 2000) 
     { 
      System.Collections.Generic.List<string> previousHandles = new 
System.Collections.Generic.List<string>(); 
      System.Collections.Generic.List<string> currentHandles = new 
System.Collections.Generic.List<string>(); 
      previousHandles.AddRange(driver.WindowHandles); 
      elementToBeClicked.Click(); 

      Thread.Sleep(timer); 
      for (int i = 0; i < 20; i++) 
      { 
       currentHandles.Clear(); 
       currentHandles.AddRange(driver.WindowHandles); 
       foreach (string s in previousHandles) 
       { 
        currentHandles.RemoveAll(p => p == s); 
       } 
       if (currentHandles.Count == 1) 
       { 
        driver.SwitchTo().Window(currentHandles[0]); 
        Thread.Sleep(100); 
        return currentHandles[0]; 
       } 
       else 
       { 
        Thread.Sleep(500); 
       } 
      } 
      return null; 
     } 
0

Questo codice ha funzionato per me. Nel mio caso, la nuova finestra/scheda è un PDF che ha un certo peso, quindi eseguo alcune attese personalizzate durante il caricamento.

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5)); 
int previousWinCount = driver.WindowHandles.Count; 
// Perform the action to open a new Window 
wait.Until(driver => driver.WindowHandles.Count == (previousWinCount + 1)); 
driver.SwitchTo().Window(driver.WindowHandles.Last()); 
wait.Until(driver => driver.Url.Contains("desired_url_or_a_substring_of_it")); 

Si noti che il driver.Url quando il PDF sta caricando è "about: blank".