Элемент прокрутки в виде с селеном

Есть ли какой-либо способ в Selenium 1.x или 2.x прокручивать окно браузера, чтобы определенный элемент, идентифицированный XPath, имел в виду браузер? В Selenium существует метод фокусировки, но физически не просматривается вид в FireFox. У кого-нибудь есть предложения по тому, как это сделать?

Причина, по которой мне это нужно, - это проверить щелчок элемента на странице. К сожалению, событие не работает, если элемент не виден. У меня нет контроля над кодом, который срабатывает при щелчке элемента, поэтому я не могу отлаживать или вносить в него изменения, поэтому, самое простое решение, прокрутите элемент в представлении.

Ответы

Ответ 1

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

Прокрутка к элементу происходит неявно, поэтому вам просто нужно найти элемент, а затем работать с ним.

Ответ 2

Пробовал много вещей в отношении прокрутки, но приведенный ниже код обеспечил лучшие результаты.

Это будет прокрутка, пока элемент не появится:

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

Ответ 3

Вы можете использовать класс 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()

Ответ 4

JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("javascript:window.scrollBy(250,350)");

Возможно, вы захотите попробовать.

Ответ 5

Если вы хотите прокручивать окно 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));");

Ответ 6

Таргетинг на любой элемент и отправка ключей (или вверх/влево/вправо), похоже, тоже работает. Я знаю, что это немного взломать, но я тоже не понимаю, как использовать JavaScript для решения проблемы прокрутки.

Ответ 7

webElement = driver.findElement(By.xpath("bla-bla-bla"));
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", webElement);

Для получения дополнительных примеров перейдите сюда. Все на русском языке, но Java-код является кросс-культурным:)

Ответ 8

Это сработало для меня:

IWebElement element = driver.FindElements(getApplicationObject(currentObjectName, currentObjectType, currentObjectUniqueId))[0];
 ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", element);

Ответ 9

В Selenium нам нужна помощь исполнителя JavaScript для прокрутки до элемента или прокрутки страницы:

je.executeScript("arguments[0].scrollIntoView(true);", element);

В приведенном выше утверждении element - точный элемент, в котором нам нужно прокрутить.

Я попробовал приведенный выше код, и он работал для меня.

У меня есть полный пост и видео об этом:

http://learn-automation.com/how-to-scroll-into-view-in-selenium-webdriver/

Ответ 10

Вы можете использовать этот фрагмент кода для прокрутки:

С#

var element = Driver.FindElement(By.Id("element-id"));
Actions actions = new Actions(Driver);
actions.MoveToElement(element).Perform();

Там у вас есть

Ответ 11

Используйте драйвер для отправки ключей, таких как клавиша pagedown или downarrow, чтобы отобразить элемент. Я знаю, что это слишком простое решение и может быть неприменимо во всех случаях.

Ответ 12

По моему опыту, Selenium Webdriver не выполняет автоматическую прокрутку элемента, находящегося на клике, когда на странице имеется несколько прокручиваемых разделов (что довольно часто).

Я использую Ruby, и для моего AUT мне пришлось обезглавить метод щелчка следующим образом:

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, но он должен дать вам несколько идей.

Ответ 13

Ruby script для прокрутки элемента в представлении выглядит следующим образом.

$driver.execute_script("arguments[0].scrollIntoView(true);", element)
sleep(3)
element.click

Ответ 14

Если вы считаете, что другие ответы слишком хаки, это тоже, но в JavaScript не задействована инъекция.

Когда кнопка выключена, она разбивается и прокручивается до нее, поэтому повторите ее... ¯\_ (ツ) _/¯

try
{
    element.Click();
}
catch {
    element.Click();
}

Ответ 15

Иногда мне также приходилось сталкиваться с проблемой прокрутки с помощью 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);");

Ответ 16

Я использовал этот способ для прокрутки элемента и нажал:

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();
}

Ответ 17

def scrollToElement(element: WebElement) = {
  val location = element.getLocation
  driver.asInstanceOf[JavascriptExecutor].executeScript(s"window.scrollTo(${location.getX},${location.getY});")
}

Ответ 19

Это повторное решение с JavaScript, но с добавленным элементом ожидания.

В противном случае ElementNotVisibleException может появиться, если ElementNotVisibleException какое-либо действие над элементом.

this.executeJavaScriptFunction("arguments[0].scrollIntoView(true);", elementToBeViewable);
WebDriverWait wait = new WebDriverWait(getDriver(), 5);
wait.until(ExpectedConditions.visibilityOf(elementToBeViewable));

Ответ 20

В большинстве случаев для прокрутки этот код будет работать.

WebElement element = driver.findElement(By.xpath("xpath_Of_Element"));                 
js.executeScript("arguments[0].click();",element);

Ответ 21

JAVA

Попробуйте перейти к элементу, использующему позицию x y, и используйте JavascriptExecutor с аргументом is: "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 +")");

Ответ 22

В Java мы можем прокручивать с помощью JavaScript, как в следующем коде:

driver.getEval("var elm = window.document.getElementById('scrollDiv'); if (elm.scrollHeight > elm.clientHeight){elm.scrollTop = elm.scrollHeight;}");

Вы можете назначить требуемое значение переменной "elm.scrollTop".

Ответ 23

Вот как я это делаю с 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 # предполагает использование местоположения + moveto, поскольку location _in_view является внутренним методом.

Ответ 24

Что-то, что сработало для меня, это использовать метод Browser.MoveMouseToElement для элемента в нижней части окна браузера. Чудом он работал в Internet Explorer, Firefox и Chrome.

Я выбрал это по методу инъекции JavaScript только потому, что он чувствовал себя менее взломанным.

Ответ 25

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;
    }
}

Ответ 26

Я тестировал компоненты ADF, и для прокрутки вам нужно иметь отдельную команду для прокрутки, если используется ленивая загрузка. Если объект не загружен, и вы пытаетесь найти его с помощью Selenium, Selenium будет генерировать исключение, не найденное элементом.

Ответ 27

Этот код работает для меня:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.scrollBy(250, 350)");

Ответ 28

Если ничего не работает, попробуйте это, прежде чем нажимать:

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);
}

Ответ 29

Поведение по умолчанию для 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);
}

Ответ 30

Решение:

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);
}