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 ]

0 голосов
/ 07 июня 2013

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

element.SendKeys("");
element.Click();
0 голосов
/ 06 марта 2013

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

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();
    }
0 голосов
/ 24 сентября 2012

Я решил проблему с помощью .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'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");
        }
    }

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

0 голосов
/ 23 мая 2012

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

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

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

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

0 голосов
/ 17 июня 2011

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

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

0 голосов
/ 14 июля 2015

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

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

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

0 голосов
/ 14 октября 2015

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);
0 голосов
/ 07 апреля 2011

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

Сначала я добавил 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

...