2013-04-17 3 views
8

C'è un Ui di blocco che copre tutti gli elementi per alcuni secondi dopo che l'Elemento è stato generato nel browser a causa di questo sto affrontando un problema, poiché l'elemento è arrivato all'esistenza il web-driver prova a fare clic sull'elemento ma il clic viene ricevuto dall'interfaccia utente del blocco. Ho cercato di usare l'attesa Fino ma non ho aiutare, dato che posso trovare isClickAble in C# WebDriverWebdriver Come aspettare che l'elemento sia cliccabile nel webdriver C#

var example = _wait.Until<IWebElement>((d) => d.FindElement(By.XPath("Example"))); 
    var example2 = _wait.Until<IWebElement>(ExpectedConditions.ElementIsVisible(By.XPath("Example"))); 
example.click(); 
example2.click(); 

C'è C# equivalente per isClickAble, Grazie in anticipo

risposta

23

Beh dare un'occhiata nella sorgente di Java, mi dice che è fondamentalmente facendo due cose per determinare se si tratta di 'cliccabile':

https://code.google.com/p/selenium/source/browse/java/client/src/org/openqa/selenium/support/ui/ExpectedConditions.java

In primo luogo, sarà verificare se è 'visibile', utilizzando lo standard ExpectedConditions.visibilityOfElementLocated, sarà quindi sufficiente verificare se lo element.isEnabled() è true oppure no.

Questo può essere condensato un po ', questo significa (semplificato, in C#):

  1. Attendere che l'elemento viene restituito dal DOM
  2. Attendere proprietà dell'elemento .Displayed è vero (che è essenzialmente cosa sta verificando per visibilityOfElementLocated).
  3. Attendere fino a quando la proprietà .Enabled dell'elemento è vera (che è essenzialmente ciò che viene verificato da elementToBeClickable).

vorrei attuare questo in questo modo (aggiungendo sul set corrente di ExpectedConditions, ma ci sono diversi modi di farlo:

/// <summary> 
/// An expectation for checking whether an element is visible. 
/// </summary> 
/// <param name="locator">The locator used to find the element.</param> 
/// <returns>The <see cref="IWebElement"/> once it is located, visible and clickable.</returns> 
public static Func<IWebDriver, IWebElement> ElementIsClickable(By locator) 
{ 
    return driver => 
    { 
     var element = driver.FindElement(locator); 
     return (element != null && element.Displayed && element.Enabled) ? element : null; 
    }; 
} 

utilizzabili in qualcosa di simile:

var wait = new WebDriverWait(driver, TimeSpan.FromMinutes(1)); 
var clickableElement = wait.Until(ExpectedConditions.ElementIsClickable(By.Id("id"))); 

Tuttavia , potresti avere un'idea diversa di cosa cliccabile potrebbe significare, nel qual caso, questa soluzione potrebbe non funzionare - ma è una traduzione diretta di ciò che il codice Java sta facendo g.

+1

Thank u Il problema di cui sopra ho detto era dovuto al fatto c'era blocco ui, ho risolto, la soluzione ha aiutato a risolvere un problema diverso, ancora una volta ringraziare soluzione u.Your è corretta soluzione e rappresenta l'isClickAble correttamente –

+6

Questa soluzione non garantisce che quell'elemento sia * Facoltativo *. L'elemento potrebbe essere 'visualizzato' e' abilitato', tuttavia * non selezionabile * a causa di ** l'altro elemento riceverebbe il clic **. –

+2

@AlexOkrushko, espandi cosa intendi, fornisci scenari riproducibili, esempi, errori completi ecc. Mi aspetterei che il messaggio di errore venga coperto quando si controllano entrambi ".Displayed" e ".Enabled" ma non è una cosa sicura, lì potrebbero essere casi limite - quindi ti chiederei gentilmente di presentarti uno scenario reale, non è così.Questo dovrebbe quindi essere presentato come un problema agli sviluppatori di Selenium. – Arran

1

Ecco il codice che uso per verificare se è cliccabile, altrimenti andare su un altro URL.

if (logOutLink.Exists() && ExpectedConditions.ElementToBeClickable(logOutLink).Equals(true)) 
      { 
       logOutLink.Click(); 
      } 
      else 
      { 
       Browser.Goto("/"); 
      } 
0

Se hai un problema, ad esempio "Un altro elemento avrebbe ricevuto il click", un modo per aggirare questo è quello di utilizzare un ciclo while che attende quella scatola di sovrapposizione di andare via.

//The below code waits 2 times in order for the problem element to go away. 
int attempts = 2; 
var elementsWeWantGone = WebDriver.FindElements(By.Id("id")); 
while (attempts > 0 && elementsWeWantGone.Count > 0) 
{ 
    Thread.Sleep(500); 
    elementsWeWantGone = WebDriver.FindElements(By.Id("id")); 
}