Выделите элемент с помощью Selenium
Есть ли способ в Selenium 1.x или 2.x прокрутить окно браузера так, чтобы определенный элемент, идентифицированный XPath, был виден браузеру? В Selenium есть метод фокусировки, но он не выполняет физическую прокрутку в FireFox. У кого-нибудь есть предложения как это сделать?
Мне нужна эта причина, потому что я проверяю щелчок элемента на странице. К сожалению, событие не работает, если элемент не виден. У меня нет контроля над кодом, который срабатывает при щелчке элемента, поэтому я не могу отлаживать или вносить в него изменения, поэтому, самое простое решение, прокрутить элемент в поле зрения.
37 ответов
Перепробовал много вещей в отношении прокрутки, но приведенный ниже код дал лучшие результаты.
Это будет прокручиваться, пока элемент не будет виден:
WebElement element = driver.findElement(By.id("id_of_element"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
Thread.sleep(500);
//do anything you want with the element
Вы можете использовать org.openqa.selenium.interactions.Actions
класс для перемещения к элементу.
Джава:
WebElement element = driver.findElement(By.id("my-id"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();
Python:
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).move_to_element(driver.sl.find_element_by_id('my-id')).perform()
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.scrollBy(250,350)");
Вы можете попробовать это.
Если вы хотите прокрутить окно Firefox с помощью веб-драйвера Selenium, одним из способов является использование JavaScript в коде Java. Код JavaScript для прокрутки вниз (до нижней части веб-страницы) выглядит следующим образом:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollTo(0, Math.max(document.documentElement.scrollHeight, document.body.scrollHeight, document.documentElement.clientHeight));");
Ориентация на любой элемент и отправка клавиш вниз (или вверх / влево / вправо), кажется, также работает. Я знаю, что это что-то вроде хака, но мне не очень нравится идея использовать JavaScript для решения проблемы с прокруткой.
В Selenium нам нужна помощь исполнителя JavaScript для прокрутки до элемента или прокрутки страницы:
je.executeScript("arguments[0].scrollIntoView(true);", element);
В приведенном выше заявлении element
это точный элемент, где нам нужно прокрутить.
Я попробовал приведенный выше код, и он работал для меня.
У меня есть полный пост и видео об этом:
http://learn-automation.com/how-to-scroll-into-view-in-selenium-webdriver/
webElement = driver.findElement(By.xpath("bla-bla-bla"));
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", webElement);
Для большего количества примеров, перейдите сюда. Все на русском, но Java-код кросс-культурный:)
Selenium 2 пытается прокрутить до элемента и затем нажать на него. Это потому, что Selenium 2 не будет взаимодействовать с элементом, если он не думает, что он видим.
Прокрутка к элементу происходит неявно, поэтому вам просто нужно найти элемент и затем поработать с ним.
Я обнаружил, что ограничивающий прямоугольник моего элемента был неправильным, что привело к тому, что браузер прокручивал далеко за пределы экрана. Однако следующий код мне подходит:
private void scrollToElement(WebElement webElement) throws Exception {
((JavascriptExecutor)webDriver).executeScript("arguments[0].scrollIntoViewIfNeeded()", webElement);
Thread.sleep(500);
}
Вы можете использовать этот фрагмент кода для прокрутки:
C#
var element = Driver.FindElement(By.Id("element-id"));
Actions actions = new Actions(Driver);
actions.MoveToElement(element).Perform();
Там у вас есть это
Используйте драйвер для отправки ключей, таких как pagedown или downarrow, чтобы отобразить элемент. Я знаю, что это слишком простое решение и может быть применимо не во всех случаях.
Это сработало для меня:
IWebElement element = driver.FindElements(getApplicationObject(currentObjectName, currentObjectType, currentObjectUniqueId))[0];
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", element);
Я не уверен, что вопрос все еще актуален, но после обращения к документации scrollIntoView из https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView.
Самым простым решением было бы
executor.executeScript("arguments[0].scrollIntoView({block: \"center\",inline: \"center\",behavior: \"smooth\"});",element);
Это прокручивает элемент в центр страницы.
По моему опыту, Selenium Webdriver не выполняет автоматическую прокрутку до элемента при нажатии, когда на странице имеется более одного прокручиваемого раздела (что довольно часто встречается).
Я использую Ruby, и для моего AUT мне пришлось обезьяна исправить метод click следующим образом;
class Element
#
# Alias the original click method to use later on
#
alias_method :base_click, :click
# Override the base click method to scroll into view if the element is not visible
# and then retry click
#
def click
begin
base_click
rescue Selenium::WebDriver::Error::ElementNotVisibleError
location_once_scrolled_into_view
base_click
end
end
Метод location_once_scrolled_into_view является существующим методом в классе WebElement.
Я ценю, что вы, возможно, не используете Ruby, но он должен дать вам некоторые идеи.
Сценарий Ruby для прокрутки элемента в представлении приведен ниже.
$driver.execute_script("arguments[0].scrollIntoView(true);", element)
sleep(3)
element.click
Иногда я также сталкивался с проблемой прокрутки с помощью Selenium. Поэтому я использовал javaScriptExecuter для достижения этой цели.
Для прокрутки вниз:
WebDriver driver = new ChromeDriver();
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("window.scrollBy(0, 250)", "");
Или также
js.executeScript("scroll(0, 250);");
Для прокрутки вверх:
js.executeScript("window.scrollBy(0,-250)", "");
Или же,
js.executeScript("scroll(0, -250);");
Если вы думаете, что другие ответы были слишком хакерскими, то это тоже самое, но в JavaScript не используется инъекция.
Когда кнопка находится за пределами экрана, она ломается и прокручивается к ней, поэтому повторите ее... ¯\_(ツ)_/¯
try
{
element.Click();
}
catch {
element.Click();
}
Это повторное решение с JavaScript, но с добавленным элементом ожидания.
Иначе ElementNotVisibleException
может появиться, если выполняется какое-либо действие над элементом.
this.executeJavaScriptFunction("arguments[0].scrollIntoView(??true);", elementToBeViewable);
WebDriverWait wait = new WebDriverWait(getDriver(), 5);
wait.until(ExpectedConditions.visibilityOf(elementToBeViewab??le));
Что-то, что сработало для меня, это использование метода Browser.MoveMouseToElement для элемента в нижней части окна браузера. Чудесно это сработало в Internet Explorer, Firefox и Chrome.
Я выбрал это вместо техники внедрения JavaScript только потому, что это было менее хакерским.
Возможно, вы захотите посетить страницу веб-элементов прокрутки и веб- страницу Selenium WebDriver, используя Javascript:
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
FirefoxDriver ff = new FirefoxDriver();
ff.get("http://toolsqa.com");
Thread.sleep(5000);
ff.executeScript("document.getElementById('text-8').scrollIntoView(true);");
}
ЯВА
Попробуйте прокрутить до элемента использовать x y
положение и использование JavascriptExecutor
с этим аргументом: "window.scrollBy(x, y)"
.
После импорта:
import org.openqa.selenium.WebElement;
import org.openqa.selenium.JavascriptExecutor;
Сначала вам нужно получить x y
расположение элемента.
//initialize element
WebElement element = driver.findElement(By.id("..."));
//get position
int x = element.getLocation().getX();
int y = element.getLocation().getY();
//scroll to x y
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollBy(" +x +", " +y +")");
Javascript
Решение простое:
const element = await driver.findElement(...)
await driver.executeScript("arguments[0].scrollIntoView(true);", element)
await driver.sleep(500);
В большинстве случаев для прокрутки этот код будет работать.
WebElement element = driver.findElement(By.xpath("xpath_Of_Element"));
js.executeScript("arguments[0].click();",element);
def scrollToElement(element: WebElement) = {
val location = element.getLocation
driver.asInstanceOf[JavascriptExecutor].executeScript(s"window.scrollTo(${location.getX},${location.getY});")
}
Я использовал этот способ для прокрутки элемента и нажмите:
List<WebElement> image = state.getDriver().findElements(By.xpath("//*[contains(@src,'image/plus_btn.jpg')]"));
for (WebElement clickimg : image)
{
((JavascriptExecutor) state.getDriver()).executeScript("arguments[0].scrollIntoView(false);", clickimg);
clickimg.click();
}
Selenium может прокрутить до некоторого элемента на полосе прокрутки автоматически для некоторого простого пользовательского интерфейса, но для ленивого пользовательского интерфейса scrollToElement все еще необходим.
Это моя реализация в Java с JavascriptExecutor. Вы можете найти более подробную информацию в исходном коде Satix: http://www.binpress.com/app/satix-seleniumbased-automation-testing-in-xml/1958
public static void perform(WebDriver driver, String Element, String ElementBy, By by) throws Exception {
try{
//long start_time = System.currentTimeMillis();
StringBuilder js = new StringBuilder();
String browser = "firefox";
if (ElementBy.equals("id")) {
js.append("var b = document.getElementById(\""
+ Element + "\");");
} else if (ElementBy.equals("xpath")) {
if (!"IE".equals(browser)) {
js.append("var b = document.evaluate(\""
+ Element
+ "\", document, null, XPathResult.ANY_TYPE, null).iterateNext();");
} else {
throw new Exception("Action error: xpath is not supported in scrollToElement Action in IE");
}
} else if (ElementBy.equals("cssSelector")) {
js.append("var b = document.querySelector(\""
+ Element + "\");");
} else {
throw new Exception("Scroll Action error");
}
String getScrollHeightScript = js.toString()+ "var o = new Array(); o.push(b.scrollHeight); return o;";
js.append("b.scrollTop = b.scrollTop + b.clientHeight;");
js.append("var tmp = b.scrollTop + b.clientHeight;");
js.append("var o = new Array(); o.push(tmp); return o;");
int tries = 1;
String scrollTop = "0";
while (tries > 0){
try{
String scrollHeight = ((JavascriptExecutor)driver).executeScript(getScrollHeightScript).toString();
if (scrollTop.equals(scrollHeight)) {
break;
} else if (driver.findElement(by).isDisplayed()) {
break;
}
Object o = ((JavascriptExecutor)driver).executeScript(js.toString());
scrollTop = o.toString();
Thread.sleep(interval);
tries ++;
}catch(Exception e){
throw new Exception("Action error:"
+ " javascript execute error : " + e.getMessage() + ", javascript : " + js.toString());
}
}
}catch (Exception e) {
try {
ScreenshotCapturerUtil.saveScreenShot(driver, CLASSNAME);
} catch (IOException e1) {
throw new Exception("Save screenshot error!", e1);
}
throw e;
}
}
Этот код работает для меня:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.scrollBy(250, 350)");
Если эта передача объекта не работает:
await browser.executeScript( "arguments[0].scrollIntoView()", await browser.wait( until.elementLocated( By.xpath( "//div[@jscontroller='MC8mtf']" ) ), 1000 ) );
На странице Google есть демонстрация кнопки прокрутки до микрофона. Нашел его с помощью javascript xpath, используя chromedriver и selenium-webdriver.
start1 () запускает браузер в узком окне, кнопка микрофона не отображается.
start2 () запускает браузер в узком окне, затем прокрутите до кнопки микрофона.
require('chromedriver');
const { Builder,
By,
Key,
until
} = require('selenium-webdriver');
async function start1() {
var browser = new Builder()
.forBrowser( 'chrome' )
.build();
await browser
.manage()
.window()
.setRect( { width: 80,
height: 1040,
x:-10,
y:0}
);
await browser.navigate().to( "https://www.google.com/" );
}
async function start2() {
var browser = new Builder()
.forBrowser( 'chrome' )
.build();
await browser
.manage()
.window()
.setRect( { width: 80,
height: 1040,
x:-10,
y:0}
);
await browser.navigate().to( "https://www.google.com/" );
await browser.executeScript( "document.evaluate(\"//div[@jscontroller='MC8mtf']\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.scrollIntoView(true);");
}
start1();
start2();
Решение:
public void javascriptclick(String element)
{
WebElement webElement = driver.findElement(By.xpath(element));
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].click();", webElement);
System.out.println("javascriptclick" + " " + element);
}
Я проводил тестирование с компонентами ADF, и у вас должна быть отдельная команда для прокрутки, если используется отложенная загрузка. Если объект не загружен и вы пытаетесь найти его с помощью Selenium, Selenium выдаст исключение "элемент не найден".