Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

webdriver
java
Теги: #<Tag:0x00007f7b64a5aff0> #<Tag:0x00007f7b64a5ae88>

(Andrey) #1

Не работает метод click() или работает как-то избирательно…
Все началось с того, что в выпадающем списке не смог выбрать необходимый элемент:

package com.driver;

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

public class Listdown {

     static WebDriver driver;

     public static void main(String[] args) {
         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");

         driver.findElement(By.xpath("(//strong[text()='Пол']/following-sibling::div/div[@role='listbox'])[1]")).click();
         driver.findElement(By.xpath("//div[text()='Мужской']/parent::div[@role='option']")).click();
     }
}

Не работает метод клика по элементу “Мужской”. Xpath пути к элементу в FirePath подсвечивает корректно. Для проверки вывел значение искомого элемента в консоль - в консоли, как положено, выводится слово “Мужской”.

Далее поэкспериментировал на сайте ok.ru. Путем танцев с бубнами сумел выбрать элемент выпадающего списка, но исключительно с применением Actions и двойного клика doubleClick() по элементу, метод одинарного клика click() в этом коде по-прежнему работать не будет:

package com.driver;

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;
import org.openqa.selenium.interactions.Actions;

public class Listdown {

    static WebDriver driver;

    public static void main(String[] args) {
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.manage().window().maximize();

        driver.get("https://ok.ru/dk?st.cmd=anonymMain&st.registration=on");
        selectOpt("Country", "Albania");
 }

     public static void selectOpt (String name, String option) {
         driver.findElement(By.xpath(String.format("//label[text()='%s']/parent::span/following-sibling::div", name))).click();
         Actions builder = new Actions(driver);
         WebElement elemOption = driver.findElement(By.xpath(String.format("//*[@id='country']/option[text()='%s']", option)));
         builder.doubleClick(elemOption).perform();
     }
}

Сейчас вот смотрю третий сайт и опять click() не работает (выбранный чекбокс не отмечается, только визуально подсвечивается красным на странице выполнения, т.е. какое-то действие на нем совершается, далее когда трогаешь мышь, подсветка пропадает):

package com.driver;

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

На исполнение кода в консоль вываливается сообщение:

Наверное, проблема технического плана - не кода, не хpath-а и т.д…
Работаю на: Firefox 47.0.2 + WebDriver 2.53.1 + Eclipse Neon.

Подскажите как решить проблему? Невозможно продолжать работу уже второй день…


(Yaroslav Pernerovskyy) #2

Там же написано, что клик попадает а другой элемент. Это значит, что он либо перекрыт, либо еще не успел дорисоваться. Надо дождаться пока он станет кликабельным.


(Andrey) #3

Что на всех трех сайтах элемент перекрыт либо его нету?


(Yaroslav Pernerovskyy) #4

Почему-бы и нет? У вас работают Actions потому что Actions молча кликают куда скажут. Метод WebElement.click() не просто кликает, а делает целую серию проверок доступен ли элемент, видно-ли его и т.п. потому иногда может не отрабатывать, особенно если есть анимация, или выпадайки, которые не успевают прорисовываться, либо есть какой то невидимый элемент сверху.


(Andrey) #5

Ярослав, если хотите мне помочь - проверьте код у себя. А просто абстрактные рассуждения, решить мой вопрос мне никак не помогут. Код, который я привел выше для 3 сайтов, должен работать корректно и я думаю он будет запускаться у вас или у другого человека с нормально настроенной средой. Почему у меня не работает - не знаю…
Вы говорите про Actions… Я же написал, что это танцы с бубнами для того чтобы заменить простой метод click(). И Actions в этом случае я бы не использовал - это элементарная проверка того можно ли хоть как-то по-другому отметить чек-бокс, пусть и корявым способом.


(Taras) #6

Попробуйте js клик симулировать

public class JSExecution {
	
	private JavascriptExecutor js;

	public JSExecution(WebDriver driver) {
		this.js = (JavascriptExecutor) driver;
	}

	/**
	 * execute the script with parameters
	 * @param expr	js expression
	 * @param arguments	parameters
	 * @return	Object result of execution
	 */
	public Object execScript(final String expr, Object... arguments) {
		return js.executeScript(expr, arguments);
	}
	
	/**
	 * clicks on elements with JS executor
	 * @param element	what WebElement to click
	 */
	public void clickOnElement(WebElement element) {
		execScript("arguments[0].click();", element);
	}
}

(Andrey) #7

Выбрасывает в консоль:


(Taras) #8

На javascript click??


(Andrey) #9

Taras, я создал класс, скопировал туда код который вы указали и запустил Run - вот результат.


(Taras) #10

Так стоп
А ви инстанс создали етого класса? Драйвер Ваш передали в конструктор? Покажите как Ви его используете?


(Oleksii Ihnatiuk) #11
  1. Не будьте язвительны! Вы просите помощь, а не требуете;
  2. Внимательно читайте текст ошибки, чаще всего там все описано;
  3. Ищите проблему у себя в первую очередь в понимании что происходит в вашем коде.

По существу об https://market.yandex.by/catalog/54913/list?hid=90566&track=fr_ctlg&local-offers-first=0&deliveryincluded=0&onstock=1:
Я не буду вам писать про то как работает клик, как я вижу вам это не интересно. Лишь скажу, что в тексте ошибки все пишет верно. Вы не можете нажать на элемент span, который вы ищете, клик происходит по элементу /html/body/div[1]/div[4]/div[2]/div[2]/div[3]/div/div[4]/div[2]/div/div[1]/div[1]/span/label, который и указан в тексте ошибки. Это специфика верстки.


(Andrey) #12

С этого и надо было начинать )
@Taras, я только начал изучать webdriver поэтому когда вы мне даете половинчатые решения и не говорите что надо допиливать что-то еще, то я такие решения воспринимаю как руководство к действию ctrl+c ctrl+v ) Нет я ничего не делал с тем кодом который вы мне дали…


(Taras) #13

Во первих поменяйте локатор на label так как советуют више, если не поможет то попробуйте понять что там я такого написал)


(Andrey) #14

@Taras, я разбираю видеоурок и в нем точно-такой же код с точно таким же xpath-ом (без лэйблов) работает. Вот я и пытаюсь понять почему рабочий код не работает у меня.


(Taras) #15

ну Ви же понимаете что UI-ка могла поменяться после того как бил записан даний урок. …
то что я имел в виду на счет js клика

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']"));
JSExecution jsExecution = new JSExecution(driver);
jsExecution.clickOnElement(checkboxes.get(4));

(Yaroslav Pernerovskyy) #16

Андрей, что значит абстрактные? Я вам рассказываю КАК работает метод клик в WebDriver и почему он выдает ошибку. Если вы захотите немного подумать, то догадаетесь посмотреть что написано в ошибке, попробуете поставить хотя бы слипы между кликами, попробуете запустить код в дебагере. И разберетесь куда все же оно кликает.

Ничего он не должен )) Время идет, сайты меняются. Код из видеоурока устаревает.

И да, Actions это ни разу не танцы с бубном. Видели бы вы реализацию FirefoxDriver изнутри ))


(Andrey) #17

Да я ставил слипы, Ярослав (Thread.sleep(5000))… Слипы это первое о чем я подумал… Блин, что я только уже не делал за эти сутки… У меня сложилось стойкое ощущение, что проблема не в коде а в моем окружении потому что человек на стэковерфлоу воспроизвел мой код нормально и он у него отработал (вот, буквально полчаса назад, сайт не изменился за это время))).
Поэтому я хотел тут найти помощь опытных товарищей, потому как я зеленый еще, в процессе познания, может кто по окружению подскажет или еще что-то…
В общем, ладно, спасибо.


(Yaroslav Pernerovskyy) #18

Пример с яндексом - вы действительно кликаете не туда!
надо

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

Скорее всего в других примерах что-то похожее…


(Andrey) #19

Этот сайт работает, спасибо! Подскажите как в дебагере посмотреть куда клик идет?


(Oleksii Ihnatiuk) #20

Что значит куда идёт клик? Клик происходит по элементу, который вы сами находите. Если вы хотите понять почему один элемент перекрывает другой вам нужно не дебажить, а взглянуть в сторону фронтенда.