Для того, чтобы выполнить клик по элементу в арсенале класса WebElement
есть метод click()
.
WebElement element = driver.findElement(By.tagName("a")); element.click();
Существуют определенные условия для элемента, по которому можно кликнуть: элемент должен быть виден и его ширина и высота должны быть больше 0. Если элемент скрыт за границей окна браузера, то Selenium автоматически проскроллит страницу, чтобы элемент стал видимым. И только после этого кликнет по нему. Если проскроллить страницу не получается (это может быть по разным причинам), то возникнет исключение MoveTargetOutOfBoundsException
.
В случае, если нажатие на элемент вызывает загрузку новой страницы, то этот метод будет блокировать дальнейшее выполнение, пока страница не загрузится. После перезагрузки страницы любые операции над этим элементом приведут к возникновению StaleElementReferenceException. Если страница загружается с помощью AJAX, то метод не будет дожидаться ее загрузки, в этом случае нужно самостоятельно убедиться в том, что страница была загружена.
Предыдущие версии Selenium осуществляли клик в левый верхний угол элемента, начиная с версии 2.16 это было изменено, теперь клик выполняется в центр элемента. Бывают случаи, когда элемент виден лишь частично и клик в центр элемента может не срабатывать. Для того, чтобы кликнуть по указанным координатам можно использовать класс Actions, а конкретно его методы moveToElement(WebElement toElement, int xOffset, int yOffset)
и click()
. Подробнее про наведение курсора на элемент можно почитать в этой статье:
import org.openqa.selenium.interactions.Actions; Actions actions = new Actions(driver); actions.moveToElement(element, 1, 1).click()).build().perform();
Selenium сначала наведет курсор в заданную точку (в этом случае в левый верхний угол), а метод click()
, выполненный без параметров, осуществит нажатие кнопки мыши в текущем положении курсора.
Для расчета смещения, например, координат правого нижнего угла, будет полезен метод getSize()
:
import org.openqa.selenium.Dimension; import org.openqa.selenium.interactions.Actions; Dimension size = element.getSize(); Actions actions = new Actions(driver); actions.moveToElement(element, size.getWidth() - 1, size.getHeight() - 1) .click()).build().perform();
Некоторые веб-приложения переопределяют обработчик нажатия правой кнопки мыши для элементов, например, для вывода кастомного контекстное меню, вместо стандартного меню браузера. Работа с таким меню осуществляется точно также как и с другими элементами страницы — чаще это обычный элемент DOM, который изначально скрыт, или который создается с помощью javascript при нажатии правой кнопки. Для тестирования таких случаев нужно нажать правой кнопкой на элементе и дождаться появления меню, потому что обычно такие элементы загружаются не сразу. Для имитации нажатия правой кнопки мыши используется метод contextClick(WebElement onElement)
класса Actions
. Клик осуществляется в центр элемента:
import org.openqa.selenium.interactions.Actions; Actions actions = new Actions(driver); actions.contextClick(element).perform(); (new WebDriverWait(driver, 10)) .until(ExpectedConditions .visibilityOfElementLocated(By.id("menu-id")));
Иногда плагины на страницах скрывают элементы, создавая для них обвертки, перенаправляющие нажатия мыши. Бывает, что эти элементы появляются лишь по наведению курсора или при других условиях. И если сам плагин не представляет ценности для тестирования, а нужно лишь выполнить действие, тут и возникает проблема нажатия на невидимый элемент. При попытке кликнуть по скрытому элементу возникнет исключение ElementNotVisibleException
. Selenium не взаимодействует с невидимыми элементами, т.е. выполнить нажатие на них нельзя. Но, как говорится, если очень хочется, то можно) Кликнуть по невидимому элементу можно с помощью javascript
:
public void clickOnInvisibleElement(WebElement element) { String script = "var object = arguments[0];" + "var theEvent = document.createEvent(\"MouseEvent\");" + "theEvent.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);" + "object.dispatchEvent(theEvent);" ; ((JavascriptExecutor)driver).executeScript(script, element); }
Спасибо большое за статью!! Очень помогло))
С помощью moveToElement увидеть свою кнопку не смогла, но javascript решил мою проблему %-)
Спасибо)
TATYANA, большое спасибо за ваш труд! Данная статья очень помогла (javascript).
javascript — Очень помог!) Спасибо большое!
помогло
actions.moveToElement(element, 1, 1).build().perform();
element.click();