Подтвердить что ты не робот

Selenium 2.0b3 IE WebDriver, нажмите, не стреляйте

При использовании 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();
}

Я видел подобные вопросы (http://stackoverflow.com/info/4737205/selenium-webdriver-ie-button-issue), но у меня нет динамически генерируемых идентификаторов.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Для меня это делает драйвер IE более ожидаемым.

Ответ 3

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

Ответ 4

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

  • При нажатии FirefoxDriver срабатывает событие
Событие click не работает для определенных элементов управления при использовании 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();
    }
}

Ответ 5

Ни один из вышеперечисленных решений не работал у меня. Это сделало трюк:

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). Метод Geb выше решил эту проблему.

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

Другой:

v2.29.0

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

Ответ 10

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

Мое решение:

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

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

Ответ 11

После немного большего поиска я нашел две вещи, которые, похоже, помогли в повторяемых тестах:

Сначала я добавил ImplicitlyWait 5 секунд. Не уверен, что это применяется ко всем функциям FindElement, но я прекратил получать большую часть исключения NoSuchElementException, которое я получал.

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;

Вторым я испытывал проблемы с функцией выхода и менял код на:

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

Явное ожидание, похоже, обрабатывает то, что ImplicitlyWait не улавливает (я думаю, из-за перенаправления).

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

Ответ 12

Я испытываю это с 2.0rc2, IE8, Java. Проблема, с которой я сталкиваюсь в реализации решения, которое может отправлять несколько кликов, заключается в том, что иногда это работает. В тех случаях, когда мы дважды щелкаем по объектам, оставшаяся часть моего теста не продвигается вперед. Отправка клавиши "Enter" также не работает на наших элементах управления.

Для этого существует аналогичная проблема logged, но мои объекты не обязательно находятся рядом с "точкой обзора". Будем очень благодарны за любые предложения.

Ответ 13

Лучшим способом заставить сосредоточиться на элементе является использование Javascript. Это работает, когда ваши элементы отмечены атрибутом id. Если это не так, попросите разработчиков изменить его.

Найдите элемент, используя любой требуемый локатор/свойства. После того, как элемент будет извлечен, проверьте, содержит ли он атрибут идентификатора. Если это так, выполните следующий код, который заставит фокус к элементу:

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

Используя это, почти все проблемы с пропущенными кликами были разрешены при использовании InternetExplorerDriver.

Ответ 14

Я решил проблему с .click() следующим образом. Я использовал JS и executeScript (JS, WebElement el) вместо .click().
Пример:

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

Но после использования этого метода мы должны ждать загрузки страницы. И вот почему я использовал следующий метод:

protected synchronized void pageWaitLoad() {  
        String str = null;
        try {
            str = (String)((JavascriptExecutor)wd).executeScript("return document.readyState");
        }
        catch (Exception e) {
// it 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");
        }
    }

Вы должны вызывать pageWaitLoad() каждый раз после нажатия кнопки FORIE().

Ответ 15

Мое решение было:

Selenium WebDriver 2.29.0 (JAVA), тестируемый с FF16 и IE9

Прежде чем сделать findElement, я сделал экран браузера maxime. Он отлично работает.

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

Ответ 16

Я использовал, как обходной путь, SendKeys с пустой строкой перед каждым кликом:

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

Ответ 17

Краткий ответ:
Если вы запускаете автоматизированный тест Selenium в IE11 с открытием окна браузера на мониторе с сенсорным экраном (например, ноутбук с сенсорным экраном Windows 8), попробуйте запустить тест с открытым окном браузера в не сенсорный экран.
Исходный метод .click() должен работать отлично, не обойдя все способы обхода кода.

Ответный фон:
Я работал с тестировщиком в нашей команде QA для исследования аналогичной проблемы. Попробовав большую часть программных решений здесь и selenium webdriver IE button issue, мы в итоге обнаружили, что проблема произошла только в IE (версия 11 для нас) на тесте Windows 8 сенсорный экран для ноутбука.
Выполнение теста Selenium с окном IE, работающим на внешнем мониторе Dell, позволяло тестированию работать нормально каждый раз, даже используя только стандартный вызов .click().
Мы также потерпели неудачу в событии click для кнопки в окне Magnific Popup (http://dimsemenov.com/plugins/magnific-popup/).

Моя гипотеза: существует проблема с тем, как IE11 (не уверен в других версиях) обрабатывает перевод сенсорных событий в/из событий щелчка мыши на сенсорных экранах.

Ответ 18

WebdriverJS

В IE, когда вы пытаетесь выполнить действие click(), URL-адрес продолжает мигать в строке состояния. Это означает, что драйвер фокусируется на элементе и пытается выполнить действие click(). Чтобы завершить действие click(), я использовал метод sleep() до и после каждого действия click.

Попробуйте этот пример.

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

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

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