Прокрутка элемента в поле зрения с селеном
есть ли какой-либо способ в любом Селене 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 executor для прокрутки до элемента или прокрутки страницы:
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 us для прокрутки, поэтому элемент едва виден в верхней части окна просмотра. Кроме того, не все браузеры имеют точно такое же поведение. Это очень неприятно. Если вы записываете видео ваших тестов браузера, как я, то что вы хотите для элемента чтобы прокрутить в поле зрения и быть вертикально центрированным.
вот мое решение для 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();Примечание: я использую настроенную версию ELEMENT34 PHP-webdriver. Но в ядре нет никаких изменений. Я просто использую свой " 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затем выполните то, что вы хотите сделать.
Comments