web-dev-qa-db-fra.com

Selenium 2.0b3 IE WebDriver, Click not firing

Lorsque vous utilisez le pilote IE avec IE9, parfois la méthode Click ne sélectionne qu'un bouton, elle ne fera pas l'action de Click (). Notez que cela ne se produit que de temps en temps, donc je ne pense pas c'est le code qui est le problème. L'utilisation du pilote Firefox avec Firefox4 n'a pas de problèmes. J'ai aussi un problème où les éléments ne sont pas trouvés de temps en temps aussi, mais seulement dans IE encore une fois, pas 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();
}

J'ai vu ces questions similaires (http://stackoverflow.com/questions/4737205/Selenium-webdriver-ie-button-issue), mais je n'ai pas d'identifiants générés dynamiquement.

41
djeeg

J'ai trouvé la même chose sur Internet Explorer 8 en essayant de cliquer sur des liens en utilisant .Click() - même si je peux voir Selenium cliquer sur le lien. D'après mon expérience, il semble que si le navigateur n'a pas de focus, le clic initial ne fonctionne pas.

Une solution de contournement consiste à envoyer une .Click() à un autre élément de la page, afin que le navigateur obtienne le focus, avant d'essayer de cliquer sur le lien, par ex. c'est parent:

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

Je trouve que le IE buggy du pilote et la même version de mon code se comporte différemment sur différentes machines avec la même version d'IE.

Pour être cohérent avant chaque action, je fais ce qui suit.

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

Pour moi, cela fait que le pilote IE se comporte plus comme prévu.

15
Simon

Vous avez le même problème, cliquez sur ne fonctionne pas avec mon IE. J'ai trouvé une solution de contournement où je fais un Driver.FindElement (By.Name ("...")). SendKeys ("\ n") pour effectuer le clic (en gros, j'appuie simplement sur la touche Entrée). Pas très propre mais ça marche jusqu'à ce que le problème soit résolu!

8
Emmanuel Cecchet

J'ai refactorisé ma solution en me référant à Selenium WebDriver 2.15.0 dans mon projet et en utilisant un serveur Selenium WebDriver 2.16.0 et j'ai fait les observations suivantes:

  • L'événement click ne se déclenche correctement lors de l'utilisation de FirefoxDriver
  • L'événement click ne fonctionne pas se déclenche correctement pour certains contrôles lors de l'utilisation de RemoteWebDriver pour DesiredCapabilities.Firefox
  • L'événement click ne se déclenche correctement lors de l'utilisation du RemoteWebDriver pour le DesiredCapabilities.HtmlUnit et DesiredCapabilities.HtmlUnitWithJavaScript
  • InternetExplorerDriver et RemoteWebDriver avec DesiredCapabilities.InternetExplorer (vraiment la même chose) me donne toujours des résultats incohérents que je trouve difficile à cerner.

Ma solution aux trois premiers points a été de créer mes propres classes qui étendent RemoteWebDriver et RemoteWebElement afin que je puisse masquer mon comportement personnalisé du code de test qui continue de référencer IRemoteWebDriver et IWebElement.

J'ai ci-dessous mes "tweaks" actuels, mais si vous optez pour ces classes personnalisées, vous pourrez ajuster votre comportement de pilote et d'élément Web au contenu de votre cœur sans avoir à changer votre code de 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();
    }
}
7
Brian Hinchey

Aucune des solutions ci-dessus n'a fonctionné pour moi. Cela a fait l'affaire:

Java

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

Sensationnel

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

Geb

Ou, si vous utilisez Geb , il existe une meilleure solution meilleure qui est complètement discret:

(testé avec IE7 et Geb 0.7. )

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() { ... } }

Dans mon cas, le clic dans IE7 semblait échouer chaque fois qu'il était précédé de la fermeture d'une superposition modale animée (nous utilisons boîte de dialogue de superposition modale de jQuery Tools ). La méthode Geb ci-dessus a résolu ce problème.

7
Andy Dvorak

Essayez de définir Options Internet -> Sécurité -> Activer le mode protégé sur même paramètre pour toutes les zones, voir - http://www.mail-archive.com/[email protected]/msg13482.html . Cela vient du groupe Google Watir, mais dans mes tests Selenium 2 IE les clics sur les boutons semblent fonctionner mieux après avoir appliqué cela.

2
onl

J'utilise IE version: 9 était confronté au même problème. Ce qui suit a fonctionné dans mon cas

element.sendKeys(Keys.ENTER);
element.click();
1
Naveen Kumar

Un autre:

v2.29.0

WebDriver: * Prise en charge de Firefox 18. * IEDriver prend en charge la capacité souhaitée "requireWindowFocus". Lorsque vous utilisez cet événement et les événements natifs, le pilote IE demandera le focus et les interactions utilisateur utiliseront SendInput () pour simuler les interactions utilisateur. Notez que cela signifie que vous NE DEVEZ PAS utiliser la machine exécutant IE pour toute autre chose pendant l'exécution des tests.

1
gonella

PHPUnit + facebook/php-webdriver parfois la fonction click () ne coche pas l'élément de case à cocher.

ma solution est:

$Element = $WebDriver->findElement(
    WebDriverBy::id('checkbox_id')
);

if(false === $Element->isSelected())
{
    $Element->sendKeys(WebDriverKeys::SPACE);
}
1
darkling

Absolument aucune des autres choses n'a fonctionné pour moi. Certains clics InternetExplorerDriver fonctionnaient pour moi, d'autres non. Puis j'ai découvert que j'avais manqué une ligne dans la documentation : le niveau de zoom du navigateur doit être réglé à 100%.

Je suis sûr que toutes les autres réponses se réfèrent à des cas où le niveau de zoom est déjà à 100%, mais cela a corrigé mon cas. Alors vérifiez d'abord.

1
reinierpost

Réponse courte:
Si vous exécutez un test Selenium automatisé dans IE11 avec la fenêtre du navigateur ouverte sur un écran tactile (par exemple, un ordinateur portable tactile Windows 8 ), essayez d'exécuter le test avec la fenêtre du navigateur ouverte dans un écran non tactile .
La méthode .click () d'origine devrait fonctionner correctement sans toutes les solutions de contournement de code.

Contexte de la réponse:
J'ai travaillé avec un testeur de notre équipe AQ ​​pour enquêter sur un problème similaire. Après avoir essayé la plupart des solutions de code ici et sur Selenium webdriver IE issue button , nous avons finalement trouvé que le problème ne se produisait que dans IE (version 11 pour nous) sur l'écran tactile de l'ordinateur portable Windows 8 du testeur.
L'exécution du test Selenium avec la fenêtre IE exécutée sur leur moniteur Dell externe a permis au test de fonctionner correctement à chaque fois, même en utilisant uniquement l'appel standard .click ().
Nous avons également échoué lors de l'événement de clic d'un bouton dans une boîte de dialogue Magnific Popup ( http://dimsemenov.com/plugins/magnific-popup/ ).

Mon hypothèse: il y a un problème avec la façon dont IE11 (pas sûr des autres versions) gère la traduction des événements tactiles vers/depuis les événements de clic de souris sur les écrans tactiles.

0
Jason Snelders

Après un peu plus de recherche, j'ai trouvé deux choses qui semblent avoir aidé dans les tests reproductibles:

J'ai d'abord ajouté un ImplicitlyWait de 5 secondes. Je ne sais pas si cela s'applique à toutes les fonctions FindElement, mais j'ai cessé d'obtenir la plupart des NoSuchElementException que j'obtenais.

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;

Deuxièmement, j'avais des problèmes avec une fonction de déconnexion et j'ai changé le code en:

public LoginPageObject Logout() {
    Driver.FindElement(By.LinkText("Logout")).Click();

    OpenQA.Selenium.Support.UI.IWait<IWebDriver> 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'attente explicite semble gérer ce que l'ImplicitlyWait n'attrape pas (je pense à cause des redirections).

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

0
djeeg

Une meilleure façon de forcer le focus sur l'élément est d'utiliser Javascript. Cela fonctionne lorsque vos éléments sont étiquetés avec l'attribut id. Si ce n'est pas le cas, demandez aux développeurs de le changer.

Trouvez l'élément en utilisant le localisateur/les propriétés dont vous avez besoin. Une fois l'élément récupéré, vérifiez s'il contient un attribut ID. Si c'est le cas, exécutez le code suivant qui forcera le focus sur l'élément:

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

En utilisant cela, presque tous les problèmes de clics manqués ont été résolus lors de l'utilisation d'InternetExplorerDriver.

0
PocketDews

J'ai utilisé, comme solution de contournement, SendKeys avec une chaîne vide avant chaque clic:

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

J'ai résolu le problème avec .click () la prochaine fois. J'ai utilisé JS et executeScript (JS, WebElement el) au lieu de .click ().
Exemple:

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

Mais après avoir utilisé cette méthode, nous devons attendre pendant le chargement de la page. Et c'est pourquoi j'ai utilisé la méthode suivante:

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");
        }
    }

Vous devez appeler pageWaitLoad () à chaque fois après clickForIE ().

0
Alexander

WebdriverJS

Dans C'EST-À-DIRE lorsque vous essayez d'effectuer une action click (), l'URL continue de clignoter sur la barre d'état. Cela signifie que le pilote se concentre sur l'élément et essaie d'effectuer l'action click (). Afin de terminer son action click (), j'ai utilisé la méthode sleep () avant et après chaque action click.

Essayez cet exemple.

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();

pour effectuer un clic, nous pouvons utiliser n'importe lequel d'entre eux, testé sur IE

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

Ma solution était:

Selenium WebDriver 2.29.0 (Java), TESTÉ avec FF16 et IE9

Avant de faire un findElement, j'ai fait un écran de navigateur maxime. Ça fonctionne bien.

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();
    }
0
gonella

J'expérimente cela avec 2.0rc2, IE8, Java aussi. Le problème que j'ai avec l'implémentation d'une solution qui peut envoyer plusieurs clics est que parfois c'est le fait = travail. Dans ces cas, cliquer deux fois sur mes objets ne laisse pas le reste de mon test avancer. L'envoi de la touche "Entrée" ne fonctionne pas non plus sur nos commandes.

Il existe un problème similaire enregistré pour cela, mais mes objets ne sont pas nécessairement proches du "point de vue". Toute autre suggestion serait grandement appréciée.

0
NathanChristie