Selenium 2.0b3 IE WebDriver, fare clic su non sparare

Quando si utilizza il driver IE con IE9, a volte il metodo Click selezionerà solo un pulsante, non eseguirà l’azione di Click (). Nota questo succede solo occasionalmente, quindi non penso che sia il codice che è il problema. L’utilizzo del driver Firefox con Firefox4 non ha problemi. Ho anche un problema in cui gli elementi non vengono trovati di tanto in tanto, ma solo in IE di nuovo, non in Firefox.

if (Driver.FindElement(By.Name("username")) == null) { //sometimes gets here in IE, never gets here in Firefox } Driver.FindElement(By.Name("username")).SendKeys(username); Driver.FindElement(By.Name("surname")).SendKeys(surname); Driver.FindElement(By.Name("firstname")).SendKeys(firstname); string url = Driver.Url; Driver.FindElement(By.Name("cmd")).Click(); if (Driver.Url == url) { //if the page didnt change, click the link again Driver.FindElement(By.Name("cmd")).Click(); } 

Ho visto queste domande simili (http://stackoverflow.com/questions/4737205/selenium-webdriver-ie-button-issue), ma non ho id dinamici.

Ho trovato la stessa cosa su Internet Explorer 8 quando tento di fare clic sui collegamenti usando .Click() – anche se posso vedere il selenium cliccando sul link. Dalla mia esperienza sembra che se il browser non ha il focus allora il clic iniziale non funziona.

Una soluzione alternativa a questo è inviare un .Click() a un altro elemento della pagina, in modo che il browser ottenga lo stato attivo, prima di tentare di fare clic sul collegamento, ad es.

 Driver.FindElement(By.Id("Logout")).FindElement(By.XPath("..")).Click(); Driver.FindElement(By.Id("Logout")).Click(); 

Trovo il driver IE buggy e la stessa versione del mio codice si comporta in modo diverso su macchine diverse con la stessa versione di IE.

Per ottenere costantemente prima di ogni azione, faccio quanto segue.

  driver.SwitchTo().Window(driver.CurrentWindowHandle);//Force Focus 

Per me questo fa sì che il driver IE si comporti di più come previsto.

Ha lo stesso problema, fare clic su non funziona con il mio IE. Ho trovato una soluzione alternativa in cui faccio un Driver.FindElement (By.Name (“…”)). SendKeys (“\ n”) per eseguire il clic (in pratica ho appena premuto invio sul pulsante). Non molto pulito ma funziona fino a quando il problema non viene risolto!

Ho effettuato il refactoring della mia soluzione basata sul riferimento Selenium WebDriver 2.15.0 nel mio progetto e utilizzando un Selenium WebDriver Server 2.16.0 e ho effettuato le seguenti osservazioni:

  • L’evento click si FirefoxDriver correttamente quando si utilizza FirefoxDriver
  • L’evento click non viene RemoteWebDriver correttamente per determinati controlli quando si utilizza RemoteWebDriver per DesiredCapabilities.Firefox
  • L’evento click viene RemoteWebDriver correttamente quando si utilizza RemoteWebDriver per DesiredCapabilities.HtmlUnit e DesiredCapabilities.HtmlUnitWithJavaScript
  • InternetExplorerDriver e RemoteWebDriver con DesiredCapabilities.InternetExplorer (in realtà la stessa cosa) mi danno ancora risultati incoerenti che trovo difficili da definire.

La mia soluzione ai primi tre punti è stata quella di creare le mie classi che estendono RemoteWebDriver e RemoteWebElement modo da poter hide il mio comportamento personalizzato dal codice di test che continua a fare riferimento a IRemoteWebDriver e IWebElement .

Ho sotto i miei attuali “ritocchi”, ma se segui queste lezioni personalizzate sarai in grado di modificare il comportamento del tuo driver e del tuo elemento web in base al contenuto del tuo cuore senza dover modificare il codice di test.

 public class MyRemoteWebDriver : RemoteWebDriver { //Constructors... protected override RemoteWebElement CreateElement(string elementId) { return new MyWebElement(this, elementId); } } public class MyWebElement : RemoteWebElement, IWebElement { //Constructor... void IWebElement.Click() { if (Settings.Default.WebDriver.StartsWith("HtmlUnit")) { Click(); return; } if (TagName == "a") { SendKeys("\n"); Thread.Sleep(100); return; } if (TagName == "input") { switch (GetAttribute("type")) { case "submit": case "image": Submit(); return; case "checkbox": case "radio": //Send the 'spacebar' keystroke SendKeys(" "); return; } } //If no special conditions are detected, just run the normal click Click(); } } 

Nessuna delle soluzioni di cui sopra ha funzionato per me. Questo ha fatto il trucco:

Giava

 element.sendKeys(org.openqa.selenium.Keys.CONTROL); element.click(); 

Groovy

 element < < org.openqa.selenium.Keys.CONTROL element.click() 

Geb

Oppure, se stai utilizzando Geb , c'è una soluzione ancora migliore che è completamente invadente:

(testato con IE7 e Geb 0.7.0 )

 abstract class BaseSpec extends geb.spock.GebSpec { static { def oldClick = geb.navigator.NonEmptyNavigator.metaClass.getMetaMethod("click") def metaclass = new geb.navigator.AttributeAccessingMetaClass(new ExpandoMetaClass(geb.navigator.NonEmptyNavigator)) // Wrap the original click method metaclass.click = {-> delegate < < org.openqa.selenium.Keys.CONTROL oldClick.invoke(delegate) } metaclass.initialize() geb.navigator.NonEmptyNavigator.metaClass = metaclass } } class ClickSpec extends BaseSpec { def "verify click"() { given: to HomePage expect: waitFor { at HomePage } when: dialog.dismiss() // Call the wrapped .click() method normally $('#someLink').click() then: waitFor { at SomePage } } } class HomePage extends geb.Page { static url = "index.html" static at = { title == "Home - Example.com" } static content = { dialog { module DialogModule } } } class SomePage extends geb.Page { ... } class DialogModule extends geb.Module { def dismiss() { ... } } 

Nel mio caso, fare clic su IE7 sembrava fallire ogni volta che era preceduto dalla chiusura di un overlay modale animato (stiamo usando jQuery Tools Overlay Modal Dialog ). Il metodo Geb sopra ha risolto questo problema.

Prova a impostare Opzioni Internet -> Sicurezza -> Abilita modalità protetta alla stessa impostazione per tutte le zone , vedi http://www.mail-archive.com/watir-general@googlegroups.com/msg13482.html . Questo viene dal googlegroup di Watir, ma nei miei test sul selenium 2 i clic sul pulsante IE sembrano funzionare meglio dopo l’applicazione.

Sto usando la versione di IE: 9 Stavo affrontando lo stesso problema. Quanto segue ha funzionato nel mio caso

 element.sendKeys(Keys.ENTER); element.click(); 

Assolutamente nessuna delle altre cose ha funzionato per me. Alcuni click () di InternetExplorerDriver funzionavano per me, altri no. Poi ho scoperto che avevo perso una riga nella documentazione : il livello di zoom del browser deve essere impostato al 100%.

Sono sicuro che tutte le altre risposte si riferiscono a casi in cui il livello di zoom è già al 100%, ma ha risolto il mio caso. Quindi controlla prima.

Un altro:

v2.29.0

WebDriver: * Supporto per Firefox 18. * IEDriver supporta la funzionalità desiderata “requireWindowFocus”. Quando si utilizzano questo e gli eventi nativi, il driver IE richiederà l’triggerszione e le interazioni utente utilizzeranno SendInput () per simulare le interazioni dell’utente. Nota che questo significa che NON DEVI usare la macchina che esegue IE per qualcos’altro mentre i test sono in esecuzione.

PHPUnit + facebook / php-webdriver a volte la funzione click () non seleziona checkbox element.

la mia soluzione è:

 $Element = $WebDriver->findElement( WebDriverBy::id('checkbox_id') ); if(false === $Element->isSelected()) { $Element->sendKeys(WebDriverKeys::SPACE); } 

Dopo un po ‘più di ricerca ho trovato due cose che sembrano aver aiutato nei test ripetibili:

Per prima cosa ho aggiunto ImplicitlyWait di 5 secondi. Non sono sicuro se questo è applicato a tutte le funzioni di FindElement, ma ho smesso di ottenere la maggior parte della NoSuchElementException che stavo ottenendo.

 OpenQA.Selenium.IE.InternetExplorerDriver driver = new OpenQA.Selenium.IE.InternetExplorerDriver(); driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0, 0, 5, 0)); //driver.Manage().Speed = Speed.Medium; 

In secondo luogo ho avuto problemi con una funzione di disconnessione e ho cambiato il codice in:

 public LoginPageObject Logout() { Driver.FindElement(By.LinkText("Logout")).Click(); OpenQA.Selenium.Support.UI.IWait wait = new OpenQA.Selenium.Support.UI.WebDriverWait(Driver, TimeSpan.FromSeconds(5)); IWebElement element = wait.Until(driver => driver.FindElement(By.Name("username"))); LoginPageObject lpage = new LoginPageObject(Driver); return lpage; } 

L’attesa esplicita sembra gestire ciò che ImplicitlyWait non cattura (penso a causa dei reindirizzamenti).

http://code.google.com/p/selenium/source/browse/trunk/support/src/csharp/webdriver-support/UI/WebDriverWait.cs?r=10855

Sto vivendo questo con 2.0rc2, IE8, Java pure. Il problema che ho con l’implementazione di una soluzione che può inviare più clic è che a volte funziona. In quei casi, cliccando due volte sui miei oggetti, il resto del mio test non si sposta in avanti. L’invio del tasto “Invio” non funziona neanche sui nostri controlli.

C’è un problema simile registrato per questo, ma i miei oggetti non sono necessariamente vicini al “punto di vista”. Altri suggerimenti sarebbero molto apprezzati.

Un modo migliore per forzare l’attenzione sull’elemento è usare Javascript. Funziona quando i tuoi elementi sono taggati con l’attributo id. Se non lo sono, chiedi agli sviluppatori di cambiarlo.

Trova l’elemento usando qualsiasi locatore / proprietà di cui hai bisogno. Una volta recuperato l’elemento, controlla se contiene un attributo ID. Se lo fa, quindi esegui il seguente codice che costringerà a focalizzare l’elemento:

 JavascriptExecutor executor = (JavascriptExecutor) webDriver(); executor.executeScript("document.getElementById('" + element.GetAttribute("id") + "').focus()"); 

Usando questo, quasi tutti i problemi con i clic mancati sono stati risolti quando si utilizza InternetExplorerDriver.

Ho risolto il problema con .click () il prossimo modo. Ho usato JS ed executeScript (JS, WebElement el) invece di .click ().
Esempio:

 protected void clickForIE(WebElement element){ ((JavascriptExecutor)wd).executeScript("var tmp = arguments[0]; tmp.click()", element); } 

Ma dopo aver usato questo metodo dovremmo aspettare il caricamento della pagina. Ed è per questo che ho usato il prossimo metodo:

 protected synchronized void pageWaitLoad() { String str = null; try { str = (String)((JavascriptExecutor)wd).executeScript("return document.readyState"); } catch (Exception e) { // it's need when JS isn't worked pageWaitLoad(); return; } System.out.println("ttt " + str); while(!str.equals("complete")){ try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } str = (String)((JavascriptExecutor)wd).executeScript("return document.readyState"); } } 

È necessario chiamare pageWaitLoad () ogni volta dopo clickForIE ().

La mia soluzione era:

Selenium WebDriver 2.29.0 (JAVA), TESTED con FF16 e IE9

Prima di creare un elemento di ricerca, ho fatto una schermata del browser massima. Funziona bene.

 public void maximeBrowser() { Toolkit toolkit = Toolkit.getDefaultToolkit(); Dimension screenResolution = new Dimension((int)toolkit.getScreenSize().getWidth(), (int)toolkit.getScreenSize().getHeight()); //Maximize the browser logger.info("Maximizing the browser : getWidth ["+screenResolution.getWidth()+"] - getHeight ["+screenResolution.getHeight()+"]"); getDriver().manage().window().maximize(); } 

Ho usato, come soluzione alternativa, SendKeys con una stringa vuota prima di ogni clic:

 element.SendKeys(""); element.Click(); 

Risposta breve:
Se stai eseguendo un test Selenium automatizzato in IE11 con la finestra del browser aperta su un monitor touch screen (ad es. Windows 8 touch laptop), prova a eseguire il test con la finestra del browser aperta in un non-touch screen .
Il metodo originale .click () dovrebbe funzionare correttamente senza tutti i metodi di aggiramento del codice.

Rispondi allo sfondo:
Ho lavorato con un tester nel nostro team di QA per indagare su un problema simile. Dopo aver provato la maggior parte delle soluzioni di codice qui e al problema del pulsante IE sul selenium web , alla fine abbiamo rilevato che il problema si verificava solo in IE (versione 11 per noi) sul touch screen del portatile Windows 8 del tester.
L’esecuzione del test Selenium con la finestra IE in esecuzione sul proprio monitor esterno Dell ha consentito al test di funzionare correttamente ogni volta, anche utilizzando solo la chiamata standard .click ().
Stavamo anche fallendo l’evento click per un pulsante in una finestra di dialogo Magnific Popup ( http://dimsemenov.com/plugins/magnific-popup/ ).

La mia ipotesi: c’è un problema con il modo in cui IE11 (non sono sicuro delle altre versioni) gestisce la traduzione degli eventi di touch da / per gli eventi di clic del mouse sui touch screen.

WebdriverJS

In IE quando stai tentando di eseguire un’azione click (), l’URL continua a lampeggiare sulla barra di stato. Significa che il driver si sta concentrando sull’elemento e sta tentando di eseguire un’azione click (). Per completare la sua azione click (), ho usato il metodo sleep () prima e dopo ogni azione del clic.

Prova questo esempio.

 var webdriver = require('..'), By = webdriver.By, until = webdriver.until; var driver = new webdriver.Builder().usingServer().withCapabilities({'browserName': 'ie' }).build(); driver.get('http://www.google.com') .then(function(){ driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(1000 * 3); driver.findElement(By.name('q')).sendKeys('webdriver'); driver.findElement(By.name('btnG')).then(function(button){ button.click(); }); }) .then(function(){ driver.findElement(By.css('div[class="gb_Zb"] a[title="Google Apps"]')).then(function(apps){ apps.click(); driver.findElements(By.css('a[class="gb_O"]')).then(function(appsList){ console.log("apps : "+appsList.length); for(var i = 0; i < appsList.length; i++){ console.log('applications : '+i); if(i == 5) { var element = appsList[i]; driver.sleep(1000 * 5); driver.executeScript("var tmp = arguments[0]; tmp.click()", element); driver.sleep(1000 * 5); } } }) }) }) .then(null, function(err) { console.error("An error was thrown! By Promise... " + err); }); driver.quit(); 

per eseguire clic possiamo usare uno di questi, testato su IE

 element.click(); driver.actions().click(element).perform(); driver.executeScript("var tmp = arguments[0]; tmp.click()", element);