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

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

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

4b9b3361

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

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

9
ответ дан 04 авг. '10 в 11:06
источник

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

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

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
159
ответ дан 10 дек. '13 в 9:05
источник

Вы можете использовать класс 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()
120
ответ дан 20 окт. '14 в 11:32
источник
JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("javascript:window.scrollBy(250,350)");

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

26
ответ дан 22 марта '12 в 23:45
источник

Если вы хотите прокручивать окно 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));");
14
ответ дан 30 авг. '12 в 14:23
источник
webElement = driver.findElement(By.xpath("bla-bla-bla"));
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", webElement);

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

8
ответ дан 12 сент. '14 в 10:22
источник

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

8
ответ дан 17 мая '13 в 18:04
источник

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

4
ответ дан 13 февр. '14 в 1:15
источник

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

С#

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

Там у вас есть

4
ответ дан 08 нояб. '16 в 19:53
источник

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

4
ответ дан 08 июля '13 в 20:40
источник

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

IWebElement element = driver.FindElements(getApplicationObject(currentObjectName, currentObjectType, currentObjectUniqueId))[0];
 ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", element);
3
ответ дан 27 мая '14 в 10:08
источник

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

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

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

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

У меня есть полная запись и видео по этому поводу:

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

3
ответ дан 07 сент. '16 в 12:06
источник

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

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

try
{
    element.Click();
}
catch {
    element.Click();
}
2
ответ дан 29 июля '16 в 7:31
источник

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

$driver.execute_script("arguments[0].scrollIntoView(true);", element)
sleep(3)
element.click
2
ответ дан 30 июня '16 в 9:23
источник

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

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

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();
}
1
ответ дан 10 апр. '14 в 22:57
источник

Вы можете посетить страницу Прокрутить веб-элементы и веб-страницу - 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);");
}
1
ответ дан 14 июля '14 в 12:33
источник
def scrollToElement(element: WebElement) = {
  val location = element.getLocation
  driver.asInstanceOf[JavascriptExecutor].executeScript(s"window.scrollTo(${location.getX},${location.getY});")
}
1
ответ дан 08 мая '14 в 9:10
источник

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

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

0
ответ дан 21 февр. '14 в 19:46
источник

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;
    }
}
0
ответ дан 03 июня '14 в 11:26
источник

Вот как я это делаю с 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 является внутренним методом.

0
ответ дан 27 янв. '14 в 18:25
источник

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

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

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

0
ответ дан 10 апр. '13 в 16:34
источник
WebElement ScrollLocation=driver.findElement(By.xpath("xpath"));
    JavascriptExecutor js = (JavascriptExecutor)driver;
    js.executeScript("arguments[0].scrollIntoView(true);", ScrollLocation);
0
ответ дан 07 дек. '18 в 20:49
источник

Поведение по умолчанию для 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);
}
0
ответ дан 04 марта '16 в 7:35
источник

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

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.scrollBy(250, 350)");
0
ответ дан 27 нояб. '14 в 13:33
источник

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

0
ответ дан 27 июня '14 в 5:08
источник

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

WebElement element = driver.findElement(By.xpath("xpath_Of_Element"));                 
js.executeScript("arguments[0].click();",element);
0
ответ дан 19 февр. '19 в 13:00
источник

Решение:

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);
}
0
ответ дан 14 февр. '17 в 14:13
источник

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

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

this.executeJavaScriptFunction("arguments[0].scrollIntoView(??true);", elementToBeViewable);
WebDriverWait wait = new WebDriverWait(getDriver(), 5);
wait.until(ExpectedConditions.visibilityOf(elementToBeViewab??le));
0
ответ дан 25 янв. '17 в 16:26
источник

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

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);
}
0
ответ дан 11 февр. '16 в 12:19
источник