t.me/atinfo_chat Telegram группа по автоматизации тестирования

[WebDriver + Java] Не работает метод click()

Теги: #<Tag:0x00007f9afb457048> #<Tag:0x00007f9afb456ee0>

Дак, если мне память не изменяет, то кликнуть чекбокс по спану ваще в принципе нельзя. Чекнуть можно только по input (type=“checkbox”) или клик по <label>. Как правило лейбл связывают с инпутом по айдишнику. К тому же, если сделать вот такое изменение:

<label class="checkbox__label" for="glf-7893318-152898">Electrolux</label>

// изменить на

<label class="checkbox__label" for="абра_кадабра">Electrolux</label>

то и клик по лейблу не даст результата

у вас там ничего не перекрывает, просто по такому элементу ваще нет возможности кликнуть, для выбора чекбокса - //div[@class='n-filter-panel-aside__content']/div[4]//span[@class='checkbox__box']

вам надо кликать либо по инпуту input (type=“checkbox”) или по лейблу, если он связан с леблом по айдишнику…

Это все касается сугубо верстки, и не как не касается веб-драйвера и вашего кода…

Яркий тому пример

В консольке браузера сделайте клик сначала по:

// это ваш спан - <span class="checkbox__box">

$(".checkbox__box").click();

// инпут с типом "checkbox" <input class="checkbox__control" type="checkbox" id="glf-7893318-152898">

$(".checkbox__control").click();

// это ваше лейбл, который связан c айдишником инпута - <label class="checkbox__label" for="glf-7893318-152898">Electrolux</label>

$(".checkbox__label").click();

только когда будете эксперементировать, ждите долго, пока не проставятся галочки, а то там их много с такими класами и айдишниками :slight_smile:

Кстати, вроде спан тоже можно связать по айдишнику с инпутом, но это вроде плохая практика, связывают, как правило лейблы, а в спан заворачивают. Поэтому вы просто кликали по элементу, которые не относиться к инпуту типа checkbox

С тем же успехом можно кликать по дивчику <div>, в который завернут спан и инпут нужный…

Все что выше написал - это по поводу:

List<WebElement> checkboxes = driver.findElements(By.xpath("//div[@class='n-filter-panel-aside__content']/div[4]//span[@class='checkbox__box']"));
checkboxes.get(4).click();

Не пишите больше про верстку/фронт-энд, если вы в них не разбираетесь.

Читайте выше внимательней, я написал, что <span> можно связать айдишником с инпутом. Читайте сначала внимательней, а потом пишите ересь…

Еще конечно, можно делать джаваскриптом вешая на него класы какие-то (active или disabled), но это хрень полнейшая… Кликнуть по нему нельзя будет…

90% js front-end фреймворков с вами не согласны

в данном контексте (автора поста) - span, в который обернут input - не является кликабельным, для выбора чекбокса, что я выше и написал…

Знаете, span в который обернут input - является кликабельным. И это подверждено видеофайлом работы этого кода. Именно поэтому возник мой вопрос - почему “там” работает, а у меня нет… HTML-код на видео и в данный момент на сайте одинаковый…
Вот скриншот видео:

Поверите мне на слово, что чекбокс по данному xpath-у чекается (на видео)?

https://www.w3schools.com/tags/tag_span.asp
почитайте что такое span тег ))) че ви соритесь)

Запустите кто-нибудь мой первый код гугл-аккаунта у себя. Какой результат?

Очень сложно спорить с участниками форума которые умеют в js|css|angular|gwt|reactjs|polymer|dojo|etc.
И что

– sorry, дальше этого предложения не читал - не видел смысла…

@PrinceOFF
Вы, как топик стартер,таки озвучите свое окружение (env) ,или это секрет?

Proveril, tvoi kod klikaet i vubiraet Mygskoi: https://www.screencast.com/t/JTCVZLAM36uh

не знаю, не верится мне, что клик на него должен что-то выбирать. У меня даже используя Selenide, не получилось нажать на этот элемент… Как-то так получается - http://take.ms/1wZ1y

https://github.com/evgmoskalenko/web-qa-java-framework/blob/master/src/test/java/com/testframework/Example.java

@vmaximv, так я написал выше - Firefox 47.0.2 + WebDriver 2.53.1 или какие данные еще добавить надо, скажите буду знать на будущее.

@Dmitry_Nesterov, спасибо, я так и думал, что он рабочий и у меня что-то с настройками…

@evgmoskalenko, а как вы на этом скриншоте это видите?. Опять же учитывая то, что в учебном уроке клик по спану на яндексмаркете осуществляется могу только предположить, что логика кода фронтэнда построена так, что клик по этому спану или по лэйблу передаются в какую-то функцию, которая и обрабатывает событие клик, неважно по какому уровню вложенности элемента этот клик произошел.

Вижу не по скрину, я в коде открыл браузер и кликнул по этим спанам, и указал на скрине, при клике на какой - чекбокс отмечается.

Ну значит работает функция, которая отлавливает клик по внутреннему спану и передает его внешнему, как я описал выше. Нет?

Может, но чего она тогда не работает, когда:

  • имитируешь клик по этому элементу через консоль браузера?
  • когда кликаешь по нему используя селениум?

при этом пишет ошибку, что элемент не кликабелен…

У вас есть возможность в pom.xml указать последнюю версию Selenium и проексперементировать с кликами?

        <!-- Selenium-->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-firefox-driver</artifactId>
            <version>3.4.0</version>
        </dependency>

И кстати, почему именно Firefox? :slight_smile:

Да, хочу попробовать на последней версии, но не хочу удалять старый Firefox 47.0.2. Установил параллельно последний Firefox 53.0.2, сделал отдельный проект для selenium 3.4.0 но пока не могу понять, как мне сделать так, чтобы селениум подгружал Firefox 53 вместо Firefox 47.
Почему Firefox, потому что это самая полноценная и не урезанная реализация драйвера, насколько я знаю.

У вас винда? А разве можно две версии разного фаерфокса поставить? Никогда не пробовал такое сделать, но наверное можно подставить путь к другой версии таким образом:

перед инициализацией драйвера добавить такое (путь указать тот, который к новой версии):

System.setProperty("webdriver.gecko.driver", "C:\\geckodriver\\geckodriver.exe");
System.setProperty("webdriver.firefox.bin", "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");

скачать geckodriver можно здесь - https://github.com/mozilla/geckodriver/releases

должно получится так:

System.setProperty("webdriver.gecko.driver", "C:\\geckodriver\\geckodriver.exe");
System.setProperty("webdriver.firefox.bin", "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
driver = new FirefoxDriver();

на маке у себя проверил так, работает:

System.setProperty("webdriver.gecko.driver", "/usr/local/Cellar/geckodriver/0.16.1/bin/geckodriver");
System.setProperty("webdriver.firefox.bin", "/Applications/Firefox_Q.app/Contents/MacOS/firefox-bin");
driver = new FirefoxDriver();

@evgmoskalenko, да винда. Наверняка можно, просто надо много времени потратить на то, чтобы понять как прописать запуск конкретной версии в Selenium. Я установил в разные папки, все нормально, работают независимо друг от друга, но нет время чтобы разобраться как обеспечить запуск требуемой версии. Поэтому удалил Firefox 47 и оставил Firefox 53.

Что сделал:

Установил Firefox 53.0 (64-bit), подключил Selenium 3.4.0., подключил gekodriver для Firefox и код из первого поста чудесным образом заработал. Немного модифицировал (добавил функцию, но xpath тот же):

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class Checkboxnew {

     static WebDriver driver;

     public static void main(String[] args) {
	     System.setProperty("webdriver.gecko.driver", "e:\\Install autotest\\Firefox\\Geckodriver 0.16.1\\geckodriver.exe");
	
	    driver = new FirefoxDriver();
	    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
	    driver.manage().window().maximize();
	
	    driver.get("https://accounts.google.com/SignUp?service=mail&hl=ru&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fpc%3Dtopnav-about-ru");

	    selectOption("Пол", "Мужской");
	    selectOption("Страна", "Австралия (Australia)");
	
	    driver.quit();
    }

    public static void selectOption (String name, String opt) {
	    driver.findElement(By.xpath(String.format("(//strong[text()='%s']/following-sibling::div/div[@role='listbox'])[1]", name))).click();
	    driver.findElement(By.xpath(String.format("//div[text()='%s']/parent::div[@role='option']", opt))).click();
	
    }

}

Вывод: метод click() работает в штатном режиме, код и xpath-пути верные, проблема, как я и предполагал была в Firefox 47.0.2 + WebDriver 2.53.1 + что-то еще,что мешало нормально функционировать этой связке.

Третий листинг кода для Яндекс.маркета с “некликабельным” спаном - как и ожидалось, span кликабельный ))

import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class Listcheckbox {

    static WebDriver driver;

    public static void main(String[] args) {
	System.setProperty("webdriver.gecko.driver", "e:\\Install autotest\\Firefox\\Geckodriver 0.16.1\\geckodriver.exe");
	
	    driver = new FirefoxDriver();
	    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
	    driver.manage().window().maximize();
	
	    driver.get("https://market.yandex.by/catalog/54913/list?hid=90566&track=fr_ctlg&local-offers-first=0&deliveryincluded=0&onstock=1");
	
	    List<WebElement> checkboxes = driver.findElements(By.xpath("//div[@class='n-filter-panel-aside__content']/div[4]//span[@class='checkbox__box']"));
	    checkboxes.get(4).click();                             
    }
}

Общий вывод: действительно проблема была со средой, исходный код в порядке.

@ysparrow, Ярослав, я подставил и ту строку, которую написали вы:

List<WebElement> checkboxes = driver.findElements(By.xpath("//div[@class='n-filter-panel-aside__content']/div[4]//label"));

Код работает. Как видите и span и label имеют право быть и использоваться равноправно.

Всем спасибо за участие в обсуждении. Если есть что-то добавить для меня, то буду только рад выслушать умные мысли и советы, ибо учусь…

@evgmoskalenko, ах жалко удалил уже свой старый Firefoх, не дождался вашей записи про выбор версии браузера((

То есть проблема решена? - чудесно…

Совсем не жаль, что удалили, нафига такое тестирование, когда ты используешь старую версию браузера, обычно живой пользователь панически обновляет браузеры при первой возможности, либо это происходит в автоматическом режиме. Тут конечно могу быть не прав, geckodriver - сыроват, частенько советуют откатыватся на более ранюю версию браузера.

Вот только, если все это у вас работает в одном из последних фаерфоксах, а в хроме - не работает, тогда у вас будут проблемы с запуском в разных браузерах, тест в хроме будет падать, а в firefox - проходить успешно. Вам надо эмулировать поведение пользователя, тоесть цепляться за тот элемент, который вероятнее всего кликнет пользователь. Скорее всего - это <label>, из чего следует, что использовать надо его, тогда тест пройдет успешно в обоих браузерах (chrome, firefox) + тест будет приближен к поведению пользователя.

Если посмотреть инспектором браузера, то при наведении на сам чекбокс или текст рядом - выбирается именно лейбл в исходном коде - http://take.ms/LP7Gg, за него и надо цепляться.