Выделите элемент с помощью 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 выдаст исключение "элемент не найден".

Другие вопросы по тегам