TransWikia.com

Selenium ChromeDriver でタップ(タッチ)イベントを発生させるには

スタック・オーバーフロー Asked by jirolabo on November 18, 2021

ChromeDriver で特定要素のタップイベント
touchstart
touchend
をトリガーするにはどのようにコーディングすればよいでしょうか。

2 Answers

具体的な実装例は
webdriver with Touch events

リンク先は iOS や Android の場合の質問ですが、
Windows 上の Chrome でも 同様に動作すると思います。

単純な タッチイベントは発生させられたのでそのコードを連携します。

var options = new ChromeOptions();
options.EnableMobileEmulation("Nexus 6P"); // Allows the Chrome browser to emulate a mobile device.
_driver = new ChromeDriver(options);
_driver.Url = "目的のURL";
IWebElement testDiv = _driver.FindElement(By.Id("testDiv"));
testDiv.Click();

Chrome を モバイルデバイスのエミュレーションモードで起動して クリックイベントを
発生させているだけです。
これで touchstarttouchend イベントは発生しました。
ただ、touchmove は発生しません。

下記のように TouchActions を利用する方法は Appium で リモートデバイスの場合は動作するようですが、Windows 上の Chrome では 動作しませんでした。
※ その時に参考にしたコード https://stackoverflow.com/a/49135541

new OpenQA.Selenium.Interactions.TouchActions(driver)
.Down(x, y).Move(150, 0).Perform();

Windows 上の Chrome でタッチイベントを出す方法はまだ確認できていません。

http://appium.io/
で ブラウザの制御ではなく、Windows 上の アプリをリモートで制御する方法を使うと
もうすこしタッチイベントが処理されるようになるかもしれませんが未確認です。

Answered by k system on November 18, 2021

使ったことが無いので、検索結果からの推測ですが。
以下のようなものを使うことになるでしょう。これらを調べて試してみてください。

タッチスクリーンインタフェースの取得
selenium/dotnet/src/webdriver/IHasTouchScreen.cs
selenium/dotnet/src/webdriver/Interactions/TouchAction.cs
おそらく存在すればオブジェクトが返り、無ければnullが返るか例外が発生するでしょう。

touchstart, touchend について。
selenium/dotnet/src/webdriver/ITouchScreen.cs
selenium/dotnet/src/webdriver/Interactions/TouchActions.cs
以下のDown(locationX, locationY);touchstartUp(locationX, locationY);touchendに相当すると考えられます。

/// <summary>
/// Allows the execution of the gesture 'down' on the screen. It is typically the first of a
/// sequence of touch gestures.
/// </summary>
/// <param name="locationX">The x coordinate relative to the view port.</param>
/// <param name="locationY">The y coordinate relative to the view port.</param>
void Down(int locationX, int locationY);

/// <summary>
/// Allows the execution of the gesture 'up' on the screen. It is typically the last of a
/// sequence of touch gestures.
/// </summary>
/// <param name="locationX">The x coordinate relative to the view port.</param>
/// <param name="locationY">The y coordinate relative to the view port.</param>
void Up(int locationX, int locationY);

特定要素の x,y 位置を取得するには、以下のような手順で出来るのでは?
そして、この記事のように、それが実際の表示範囲外だった場合は、スクロール等して画面上に持ってくる必要があるでしょう。
Selenium ChromeDriver how to click elements with negative x,y pixel locations? C#

// Must close unless the popup may (or may not) cover the next link.
var closeButton = Session.Driver.FindElement(By.Id(id))
    .FindElements(By.CssSelector("a.cmg_close_button"))
    .FirstOrDefault();
if (closeButton != null)
{
    Wait.Until(d => closeButton.Displayed);

    if (closeButton.Location.Y < 0 || closeButton.Location.X < 0)
    {
        Log.Error("Could not close button. The popup displayed the close_button off-screen giving it a negative x or y pixel location.");
    }
    else
    {
        closeButton.Click();
    }
}

Answered by kunif on November 18, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP