41 votes

Le sélénium 2.0b3 IE WebDriver, Cliquez sur pas de tir

Lors de l'utilisation de l'IE pilote avec IE9, à l'occasion de la méthode de Clic ne sélectionner un bouton, il l'habitude de faire l'action de la Souris(). Remarque ce problème ne se produit occasionnellement, donc je ne pense pas que c'est le code qui est le problème. À l'aide de Firefox, avec un pilote de Firefox4 a pas de problèmes. J'ai aussi eu un problème où les éléments ne sont pas trouvé parfois trop, mais seulement dans IE nouveau, 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();
}

Je l'ai vu de semblables questions (http://stackoverflow.com/questions/4737205/selenium-webdriver-ie-button-issue), mais je n'ai pas dynamicly id générés.

27voto

Naishy Points 783

J'ai trouvé la même chose sur Internet Explorer 8 lors de la tentative de cliquer sur les liens à l'aide .Cliquez sur la (les) même si je peux voir le Sélénium cliquant sur le lien. De mon expérience, il apparaît que si le navigateur n'a pas le focus, puis cliquez sur la première ne fonctionne pas.

Une solution de contournement consiste à envoyer un .Cliquez sur() pour un autre élément sur la page, de sorte que le navigateur reçoit le focus, avant d'essayer de cliquer sur le lien, par exemple il est parent:

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

15voto

Simon Points 318

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

Pour obtenir systématiquement avant chaque action, je ne les suivants.

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

Pour moi, cela rend l'IE pilote se comportent plus comme prévu.

8voto

Emmanuel Cecchet Points 136

Eu le même problème, cliquez sur ne fonctionne pas avec mon IE. J'ai trouvé une solution de contournement où je fais un Pilote.FindElement(Par.Nom("...")).sendKeys("\n") pour effectuer le clic (en gros j'ai juste appuyez sur enter sur le bouton). Pas très propre mais ça fonctionne jusqu'à ce que le problème est résolu!

7voto

Andy Dvorak Points 372

Aucune des deux solutions n'a fonctionné pour moi. Cela a fait le tour tho:

Java

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

Groovy

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

Geb

Ou, si vous êtes à l'aide de Geb, il y a une encore meilleure solution c'est complètement discrète:

(testé avec IE7 et 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() { ... } }

Dans mon cas, en cliquant sur dans IE7 semble échouer à chaque fois qu'elle a été précédée par la fermeture d'un animé de superposition modale (nous sommes à l'aide de jQuery Outils de Superposition Modale de Dialogue). Le Geb méthode ci-dessus ont résolu ce problème.

7voto

Brian Hinchey Points 1112

J'ai refait ma solution basée sur le référencement Selenium WebDriver 2.15.0 dans mon projet et à l'aide d'un Selenium WebDriver Serveur 2.16.0 et j'ai fait les observations suivantes:

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

Ma solution pour les trois premiers points a été de créer mes propres classes qui étendent RemoteWebDriver et RemoteWebElement , de sorte que je peux cacher mes personnalisé sur le comportement, le code de test qui continue de faire référence IRemoteWebDriver et IWebElement.

J'ai en dessous de mon "bricolage", mais si vous allez avec ces classes personnalisées, vous serez en mesure de modifier votre pilote et web de l'élément de comportement au contenu de votre coeur 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();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X