Элемент прокрутки в поле зрения с Selenium
есть ли какой-либо способ в любом Селене 1.x или 2.x прокрутить окно браузера так, чтобы конкретный элемент, идентифицированный XPath, был виден браузеру? В Selenium есть метод фокусировки, но он, похоже, физически не прокручивает представление в FireFox. У кого-нибудь есть предложения, как это сделать?
причина, по которой мне это нужно, - я тестирую щелчок элемента на странице. К сожалению, событие, похоже, не работает, если элемент не виден. Я не имейте контроль над кодом, который срабатывает при нажатии на элемент, поэтому я не могу отлаживать или вносить в него изменения, поэтому, самое простое решение, прокрутите элемент в поле зрения.
30 ответов
пробовали много вещей в отношении прокрутки, но приведенный ниже код дал лучшие результаты.
это будет прокручиваться, пока элемент не появится в поле зрения:
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();
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.scrollBy(250,350)");
вы можете попробовать это.
Если вы хотите прокрутить окно Firefox с помощью Selenium webdriver, одним из способов является использование JavaScript в коде Java. Код JavaScript для прокрутки вниз (в нижней части страницы) выглядит следующим образом:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollTo(0, Math.max(document.documentElement.scrollHeight, document.body.scrollHeight, document.documentElement.clientHeight));");
Selenium 2 пытается прокрутить элемент, а затем нажмите на него. Это потому, что селен 2 не будет взаимодействовать с элементом, если он не думает, что он виден.
прокрутка до элемента происходит неявно, поэтому вам просто нужно найти элемент, а затем работать с ним.
webElement = driver.findElement(By.xpath("bla-bla-bla"));
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", webElement);
дополнительные примеры иди сюда. Все на русском языке, но Java код кросс-культурный:)
таргетинг на любой элемент и посылая вниз клавиши (или вверх/влево/вправо), кажется, работает также. Я знаю, что это немного взломать, но я на самом деле не в идее использования JavaScript для решения проблемы прокрутки.
по моему опыту, 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, но это должно дать вам некоторые идеи.
вы можете использовать этот фрагмент кода для прокрутки:
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);
в Selenium нам нужно воспользоваться помощью исполнителя JavaScript для прокрутки до элемента или прокрутки страницы:
je.executeScript("arguments[0].scrollIntoView(true);", element);
в приведенном выше утверждении element
является точным элементом, где нам нужно прокрутить.
я попробовал приведенный выше код, и он сработал для меня.
у меня есть полный пост и видео на это:
http://learn-automation.com/how-to-scroll-into-view-in-selenium-webdriver/
иногда я также сталкивался с проблемой прокрутки с селеном. Поэтому я использовал 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();
}
я использовал этот способ для прокрутки элемент и нажмите:
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();
}
def scrollToElement(element: WebElement) = {
val location = element.getLocation
driver.asInstanceOf[JavascriptExecutor].executeScript(s"window.scrollTo(${location.getX},${location.getY});")
}
скрипт Ruby для прокрутки элемента в представление, как показано ниже.
$driver.execute_script("arguments[0].scrollIntoView(true);", element)
sleep(3)
element.click
вы можете посетить страницу прокрутка веб-элементов и веб-страницы-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);");
}
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;
}
}
поведение Selenium по умолчанию для прокрутки, поэтому элемент едва виден в верхней части окна просмотра. Кроме того, не все браузеры имеют одинаковое поведение. Это очень Дис-сытно. Если вы записываете видео своих тестов браузера, как я, то вы хотите для элемента для прокрутки в поле зрения и быть выровнены по вертикали.
вот мое решение для Java:
public List<String> getBoundedRectangleOfElement(WebElement we)
{
JavascriptExecutor je = (JavascriptExecutor) driver;
List<String> bounds = (ArrayList<String>) je.executeScript(
"var rect = arguments[0].getBoundingClientRect();" +
"return [ '' + parseInt(rect.left), '' + parseInt(rect.top), '' + parseInt(rect.width), '' + parseInt(rect.height) ]", we);
System.out.println("top: " + bounds.get(1));
return bounds;
}
и затем, чтобы выбрать, вы называете это так:
public void scrollToElementAndCenterVertically(WebElement we)
{
List<String> bounds = getBoundedRectangleOfElement(we);
Long totalInnerPageHeight = getViewPortHeight(driver);
JavascriptExecutor je = (JavascriptExecutor) driver;
je.executeScript("window.scrollTo(0, " + (Integer.parseInt(bounds.get(1)) - (totalInnerPageHeight/2)) + ");");
je.executeScript("arguments[0].style.outline = \"thick solid #0000FF\";", we);
}
вот как я это делаю с PHP webDriver для Selenium. Он работает для Selenium автономного сервера 2.39.0+https://github.com/Element-34/php-webdriver + Firefox 25.0
$element=$session->welement("xpath", "//input[@value='my val']");
$element->click();
$element=$session->welement("xpath", "//input[@value='ma val2']");
$element->location_in_view(); // < -- this is the candy
$element->click();
Примечание: я использую настроенную версию PHP-webdriver Element34. Но в ядре нет никаких изменений. Я просто использую свой "welement" вместо "element". Но это никак не влияет на рассматриваемый случай. Автор драйвера говорит: "чтобы почти все вызовы API были прямыми преобразование того, что определено в самом протоколе WebDriver.- Значит, у вас не должно быть проблем с другими языками программирования.
просто щелкать не будет работать в моей конфигурации. Он будет делать прокрутку вместо щелчка, поэтому мне пришлось щелкнуть дважды, не вызывая " location_in_view ()".
Примечание: этот метод работает для элементов, которые можно просмотреть, например, кнопка ввода типа.
посмотреть на: http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/location
описание для JsonWireProtocol# предлагает использование location + moveto, потому что location _in_view является внутренним методом.
Что-то, что сработало для меня, было использовать браузер.Метод MoveMouseToElement для элемента в нижней части окна браузера. Чудесным образом он работал в Internet Explorer, Firefox и Chrome.
Я выбрал это над методом инъекции JavaScript только потому, что он чувствовал себя менее хакерским.
Я проводил тестирование с компонентами ADF, и у вас должна быть отдельная команда для прокрутки, если используется ленивая загрузка. Если объект не загружен и вы пытаетесь найти его с помощью Selenium, Selenium выдаст исключение element-not-found.
Если ничего не работает, попробуйте это, прежде чем нажать:
public void mouseHoverJScript(WebElement HoverElement) {
String mouseOverScript = "if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('mouseover', true, false); arguments[0].dispatchEvent(evObj);} else if(document.createEventObject) { arguments[0].fireEvent('onmouseover');}";
((JavascriptExecutor) driver).executeScript(mouseOverScript, HoverElement);
}
в Java мы можем прокручивать с помощью JavaScript, как в следующем коде:
driver.getEval("var elm = window.document.getElementById('scrollDiv'); if (elm.scrollHeight > elm.clientHeight){elm.scrollTop = elm.scrollHeight;}");
вы можете назначить желаемое значение " вяз.scrollTop" переменной.
решение:
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);
}
это повторное решение с JavaScript, но с добавленным элементом ожидания.
иначе ElementNotVisibleException
может появиться, если выполняется какое-либо действие над элементом.
this.executeJavaScriptFunction("arguments[0].scrollIntoView(??true);", elementToBeViewable);
WebDriverWait wait = new WebDriverWait(getDriver(), 5);
wait.until(ExpectedConditions.visibilityOf(elementToBeViewab??le));
этот код работает для меня:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.scrollBy(250, 350)");
Я согласен со всеми здесь, кто говорит: "У Селена есть неявная опция прокрутки". Кроме того, если вы были в Selenium 1, и теперь вы обновили себя до Selenium 2 и ищете команды предыдущей версии, вы можете использовать команду, известную как:
Seleniumbackeddriver.
WebDriver driver = new FirefoxDriver();
public void setUp() throws Exception {
String baseUrl = "http://www.google.co.in/";
selenium = new WebDriverBackedSelenium(driver, baseUrl);
}
вы можете использовать их и использовать команды обеих версий.
сделайте случайный щелчок вниз по странице:
driver.findElement(By.id("ID of a web element present below")).click
затем выполните то, что вы хотите сделать.