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

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

Теги: #<Tag:0x00007f748b511600> #<Tag:0x00007f748b511088>

Не работает метод 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.

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

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

1 Симпатия

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

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

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

Попробуйте 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);
	}
}
1 Симпатия

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

На javascript click??

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

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

  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, который и указан в тексте ошибки. Это специфика верстки.

1 Симпатия

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

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

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

ну Ви же понимаете что 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));

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

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

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

5 Симпатий

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

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

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

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

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

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