Selenium 2.0b3 IE WebDriver, клик не стреляет - PullRequest
41 голосов
/ 07 апреля 2011

При использовании драйвера IE с IE9, иногда метод Click выбирает только кнопку, но не выполняет действие Click (). Обратите внимание, что это происходит только изредка, поэтому я не думаю, что проблема заключается в коде. Использование драйвера Firefox с Firefox4 не имеет проблем. У меня также возникает проблема, когда элементы иногда не обнаруживаются, но только в IE, а не в 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();
}

Я видел подобные вопросы (/2964907/selena-vebdraiver-ie-problema-s-knopkoi),, но у меня нет динамически генерируемых идентификаторов.

Ответы [ 18 ]

27 голосов
/ 07 апреля 2011

Я обнаружил то же самое в Internet Explorer 8 при попытке щелкнуть ссылки, используя .Click() - хотя я вижу, как Selenium нажимает на ссылку. Из моего опыта видно, что если браузер не имеет фокуса, то первоначальный щелчок не работает.

Обойти это можно, отправив .Click() другому элементу на странице, чтобы браузер получил фокус, прежде чем пытаться щелкнуть ссылку, например, это родитель:

Driver.FindElement(By.Id("Logout")).FindElement(By.XPath("..")).Click();
Driver.FindElement(By.Id("Logout")).Click();
15 голосов
/ 20 октября 2011

Я считаю, что драйвер IE глючит, и одна и та же версия моего кода ведет себя по-разному на разных компьютерах с одной и той же версией IE.

Чтобы получить согласованные данные перед каждым действием, я делаю следующее.

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

Для меня это заставляет драйвер IE вести себя как положено.

8 голосов
/ 12 апреля 2011

У меня та же проблема, щелчок не работает с моим IE. Я нашел обходной путь, где я делаю Driver.FindElement (By.Name ("...")). SendKeys ("\ n"), чтобы выполнить щелчок (в основном я просто нажимаю кнопку ввода на кнопке). Не очень чисто, но работает, пока проблема не будет устранена!

7 голосов
/ 27 апреля 2012

Ни одно из вышеперечисленных решений не помогло мне. Это добилось цели:

Java

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

Groovy

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

Геб

Или, если вы используете Geb , есть даже лучше решение, которое совершенно незаметно:

(протестировано с IE7 и 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() { ... } }

В моем случае щелчок в IE7, по-видимому, не удался, когда ему предшествовало закрытие анимированного модального наложения (мы используем jQuery Tools Overlay Modal Dialog ). Приведенный выше метод Геба решил эту проблему.

7 голосов
/ 18 апреля 2011

Я реорганизовал свое решение на основе ссылки на Selenium WebDriver 2.15.0 в моем проекте и с использованием Selenium WebDriver Server 2.16.0, и я сделал следующие наблюдения:

  • Событие щелчка правильно запускает при использовании FirefoxDriver
  • Событие щелчка не срабатывает правильно для определенных элементов управления при использовании RemoteWebDriver для DesiredCapabilities.Firefox
  • Событие щелчка правильно запускает при использовании RemoteWebDriver для DesiredCapabilities.HtmlUnit и DesiredCapabilities.HtmlUnitWithJavaScript
  • InternetExplorerDriver и RemoteWebDriver с DesiredCapabilities.InternetExplorer (на самом деле одно и то же) все еще дают мне противоречивые результаты, которые я считаю трудными прибить.

Моим решением первых трех пунктов было создание моих собственных классов, расширяющих RemoteWebDriver и RemoteWebElement, чтобы я мог скрыть свое пользовательское поведение от тестового кода, который продолжает ссылаться на IRemoteWebDriver и IWebElement.

У меня ниже моих текущих «настроек», но если вы пойдете с этими пользовательскими классами, вы сможете настроить свой драйвер и поведение веб-элемента в соответствии с вашими пожеланиями, не меняя тестовый код.

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();
    }
}
2 голосов
/ 20 июля 2011

Попробуйте установить Свойства обозревателя -> Безопасность -> Включить защищенный режим в значение , одинаковое для всех зон , см. http://www.mail -archive.com / watir-general@ googlegroups.com / msg13482.html .Это из гуглгруппы Watir, но в моих тестах Selenium 2 нажатия кнопок IE, кажется, работают лучше после применения этого.

1 голос
/ 20 января 2014

PHPUnit + facebook / php-webdriver иногда функция click () не проверяет элемент флажка.

мое решение:

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

if(false === $Element->isSelected())
{
    $Element->sendKeys(WebDriverKeys::SPACE);
}
1 голос
/ 06 марта 2013

Еще один:

v2.29.0

WebDriver: * Поддержка Firefox 18.* IEDriver поддерживает желаемую возможность requireWindowFocus.При использовании этого и собственных событий драйвер IE будет требовать фокусировки, а взаимодействие с пользователем будет использовать SendInput () для имитации взаимодействия с пользователем.Обратите внимание, что это будет означать, что вы НЕ ДОЛЖНЫ использовать машину, на которой запущен IE, для чего-либо еще во время выполнения тестов.

1 голос
/ 20 июля 2012

Абсолютно все остальное у меня не сработало.Некоторые клики InternetExplorerDriver работали для меня, некоторые - нет.Затем я обнаружил, что пропустил одну строку в документации : уровень масштабирования браузера должен быть установлен на 100%.

Я уверен, что все остальные ответы относятся к случаям, когда масштабированиеуровень уже на 100%, но это действительно исправило мой случай.Поэтому сначала проверьте это.

1 голос
/ 23 мая 2012

Я использую версию IE: 9 Столкнулся с той же проблемой.Следующее сработало в моем случае

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