web-dev-qa-db-ja.com

Seleniumを使ってビューに要素をスクロールする

XPathによって識別される特定の要素がブラウザの視野内にあるようにブラウザウィンドウをスクロールするためにSelenium 1.xまたは2.xのいずれかに方法はありますか? Seleniumにはフォーカスメソッドがありますが、FireFoxではビューを物理的にスクロールするようには見えません。誰かがこれを行う方法について何か提案がありますか?

これが必要な理由は、ページ上の要素のクリックをテストしているからです。残念ながら、このイベントは要素が表示されていない限り機能しないようです。要素がクリックされたときに発生するコードを制御することはできないので、デバッグや変更を加えることはできません。そのため、最も簡単な解決策は、アイテムをスクロールして表示することです。

166
Dan at Demand

スクロールに関して多くのことを試みましたが、以下のコードはより良い結果をもたらしました。

これは、要素が表示されるまでスクロールします。

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
170
Amith

org.openqa.Selenium.interactions.Actionsクラスを使用して要素に移動することができます。

Java:

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()
125
sascha
JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("javascript:window.scrollBy(250,350)");

あなたはこれを試してみたいかもしれません。

26
Mayur

Selenium Webドライバを使用してFirefoxウィンドウをスクロールする場合は、JavaコードでJavaScriptを使用するのが1つの方法です。 (Webページの一番下まで)スクロールするJavaScriptコードは次のとおりです。

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollTo(0, Math.max(document.documentElement.scrollHeight, document.body.scrollHeight, document.documentElement.clientHeight));");
14
Ankit Pandey
webElement = driver.findElement(By.xpath("bla-bla-bla"));
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", webElement);

より多くの例については、 ここに行きます 。すべてロシア語ですが、Javaコードは異文化間です:)

8
VovecUdalec

Selenium 2はその要素までスクロールしてそれをクリックしようとします。これは、Selenium 2が表示されていると思わない限り、Selenium 2が要素と対話しないためです。

要素へのスクロールは暗黙的に行われるため、項目を見つけてそれを操作するだけで済みます。

8
AutomatedTester

任意の要素をターゲットにして 下方向のキーを送信 (または上/左/右)も機能するようです。私はこれがちょっとしたハックであることを知っていますが、スクロールの問題を解決するためにJavaScriptを使用するという考えにも実際には興味がありません。

8
DevDave

このコードスニペットを使用してスクロールできます。

C#

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

そこにあります

5
Mohsin Awan

ドライバを使って以下のようなキーを送信します。 pagedown または downarrow 要素を表示するためのキー。私はそれがあまりにも単純な解決策であることを知っていて、そして全ての場合に適用できるわけではないかもしれません。

4
Ganesh S

これは私のために働いた:

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

私の経験上、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
Robbie Wareham

Seleniumでは、JavaScriptエグゼキュータの助けを借りて要素までスクロールするか、ページをスクロールする必要があります。

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

上記のステートメントで、elementはスクロールする必要がある正確な要素です。

私は上記のコードを試してみました、そしてそれは私のために働きました。

私はこれに関する完全な投稿とビデオを持っています:

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

3
Mukesh otwani

要素を画面にスクロールするためのRubyスクリプトは次のとおりです。

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

あなたが他の答えがハッキーすぎると思うなら、これもそうですが、JavaScriptインジェクションは関与しません。

ボタンが画面の外にあるときは、それが壊れてそれにスクロールするので、それを再試行してください...¯\ _(ツ)_ /¯

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

ときどき私は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
Anuraj R

あなたはページを訪問することをお勧めしますJavascriptを使用してWeb要素とWebページ - Selenium WebDriverをスクロールする

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
virusrocks

私はこのように要素をスクロールしてクリックするために使いました:

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
Bibek

このコードをスクロールする状況のほとんどでうまくいくでしょう。

WebElement element = driver.findElement(By.xpath("xpath_Of_Element"));                 
js.executeScript("arguments[0].click();",element);
1
SarojPurbey
def scrollToElement(element: WebElement) = {
  val location = element.getLocation
  driver.asInstanceOf[JavascriptExecutor].executeScript(s"window.scrollTo(${location.getX},${location.getY});")
}
1
omnomnom

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

私はADFコンポーネントを使ってテストを行ってきましたが、遅延ロードを使用する場合は、スクロール用に別のコマンドを使用する必要があります。オブジェクトがロードされていない状態でSeleniumを使用してオブジェクトを見つけようとすると、Seleniumはelement-not-found例外をスローします。

0
user3781490

解決策は次のとおりです。

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
akhilesh gulati

Javaでは、次のコードのようにJavaScriptを使用してスクロールできます。

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

"Elm.scrollTop"変数に希望の値を代入することができます。

0
Hemant

これはJavaScriptを使った繰り返しの解決策ですが、要素を待つことが追加されています。

そうでなければ、その要素に対する何らかのアクションが行われているときにElementNotVisibleExceptionが現れるかもしれません。

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

このコードは私のために働いています:

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

Seleniumはいくつかの単純なUIでは自動的にスクロールバーの中のいくつかの要素にスクロールすることができますが、遅延ロードUIのためにはscrollToElementがまだ必要です。

これはJavascriptExecutorを使ったJavaでの私の実装です。あなたは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
Effie

何もうまくいかない場合は、クリックする前に試してみてください。

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
Prateek

私にとってうまくいったことは、ブラウザウィンドウの下部にある要素に対してBrowser.MoveMouseToElementメソッドを使うことでした。奇妙なことに、それはInternet Explorer、Firefox、そしてChromeで動きました。

私はJavaScriptインジェクション技術よりもこれを選んだのは、ハックが少ないというだけの理由によるものです。

0
David Peters

Selenium用のPHP webDriverを使用してこれを行う方法は次のとおりです。 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のカスタマイズされたバージョンを使います。しかし、コアには変更はありません。私はただ "element"の代わりに "welement"を使います。しかし、それは問題の事件に影響を与えません。ドライバーの作者は、「ほとんどすべてのAPI呼び出しがWebDriverプロトコル自体で定義されているものを直接変換できるようにする」と述べています。他のプログラミング言語でも問題ないはずです。

クリックするだけではうまくいきません。クリックではなくスクロールをするので、 "location_in_view()"を呼び出さずに2回クリックしなければなりませんでした。

注:このメソッドは、ボタンタイプの入力のように、表示可能な要素に対して機能します。

ご覧ください。 http://code.google.com/p/Selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/location

Location _in_viewは内部メソッドなので、JsonWireProtocol#の説明ではlocation + movetoを使用しています。

0