1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SeleniumでShiftRightとShiftLeftを使い分ける

Posted at

3行でわかる概要

  • JavaのSelenium(4.0.0-alpha-4)のWebElement::sendKeysで左右Shiftキーを使い分けようとした際に少し詰まった
  • 用意されているKeysSHIFT/LEFT_SHIFTの中身が同じ
  • Keysを使わずに文字列で"ShiftRight"と指定すると右Shiftとして認識される

問題

JavaでSeleniumを使用してkeyDownさせる場合、下記のようなコードを書く。

public void sendKey(WebDriver webDriver, CharSequence... keys) {
  WebElement element = webDriver.findElement(By.className("hoge"))
  element.sendKeys(keys);
}

WebElement.sendKeysは引数にCharSequence...を取るが、用意されているenumKeysを使用することが多い。
ただし、右Shiftキー/左Shiftキーのように同一機能のキーについて左右で使い分けたい場合は注意が必要。

enumKeysの実装は下記のようになっている。
SHIFT/LEFT_SHIFTがそれぞれ定義されているが、残念なことにどちらを送った場合でも左Shiftキーの挙動になってしまう。

Keys.java
public enum Keys implements CharSequence {
  ...
  SHIFT        ('\uE008'),
  LEFT_SHIFT   (Keys.SHIFT),
  CONTROL      ('\uE009'),
  LEFT_CONTROL (Keys.CONTROL),
  ALT          ('\uE00A'),
  LEFT_ALT     (Keys.ALT),
  LEFT         ('\uE012'),
  ARROW_LEFT   (Keys.LEFT),
  UP           ('\uE013'),
  ARROW_UP     (Keys.UP),
  RIGHT        ('\uE014'),
  ARROW_RIGHT  (Keys.RIGHT),
  DOWN         ('\uE015'),
  ARROW_DOWN   (Keys.DOWN),
  ...
}

解決策

KeysCharSequenceを実装しており、コンストラクタおよびtoString()の実装は下記のようになっている。

Keys.java
public enum Keys implements CharSequence {
  ...

  private final char keyCode;
  private final int codePoint;

  Keys(Keys key) {
    this(key.charAt(0));
  }

  Keys(char keyCode) {
    this.keyCode = keyCode;
    this.codePoint = String.valueOf(keyCode).codePoints().findFirst().getAsInt();
  }

  ...

  @Override
  public String toString {
    return String.valueOf(keyCode);
  }
}

また、WebElement.sendKeysは実質与えられたkeycodeを改行区切りで結合してWebDriverに送っているだけ。
そこで、Keys.SHIFTで定義されたKeyCodeを使用せずに下記のように文字列で指定することで正常に認識されるようになる。

  WebElement element = webDriver.findElement(By.className("hoge"))
  element.sendKeys("ShiftRight");
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?