ChromeDriver で特定要素のタップイベント  
touchstart  
touchend  
をトリガーするにはどのようにコーディングすればよいでしょうか。
CC BY-SA 4.0
2019-01-25T12:04:49.793
52320
2023-06-06T01:02:55.387
3925
question
c# selenium selenium-webdriver chromedriver
Selenium ChromeDriver でタップ（タッチ）イベントを発生させるには
使ったことが無いので、検索結果からの推測ですが。  
以下のようなものを使うことになるでしょう。これらを調べて試してみてください。

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

`touchstart`, `touchend` について。  
[selenium/dotnet/src/webdriver/ITouchScreen.cs](https://github.com/SeleniumHQ/selenium/blob/11c25d75bd7ed22e6172d6a2a795a1d195fb0875/dotnet/src/webdriver/ITouchScreen.cs)  
[selenium/dotnet/src/webdriver/Interactions/TouchActions.cs](https://github.com/SeleniumHQ/selenium/blob/11c25d75bd7ed22e6172d6a2a795a1d195fb0875/dotnet/src/webdriver/Interactions/TouchActions.cs)  
以下の`Down(locationX, locationY);`が`touchstart`、`Up(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#](https://stackoverflow.com/q/38463792/9014308)

```

    // 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();
        }
    }
    
```
CC BY-SA 4.0
2019-02-03T01:57:34.593
52510
2019-02-03T02:08:35.917
2019-02-03T02:08:35.917
26370
26370
52320
answer
具体的な実装例は  
[webdriver with Touch events](https://stackoverflow.com/a/15829157)

リンク先は 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 を モバイルデバイスのエミュレーションモードで起動して クリックイベントを  
発生させているだけです。  
これで `touchstart` と `touchend` イベントは発生しました。  
ただ、`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 上の アプリをリモートで制御する方法を使うと  
もうすこしタッチイベントが処理されるようになるかもしれませんが未確認です。
CC BY-SA 4.0
2019-12-26T08:46:05.523
61807
2019-12-26T22:44:40.823
2019-12-26T22:44:40.823
18851
18851
52320
answer