Node.jsのSelenium-webdriverでE2Eテスト書くためのTips。はじめから知っていればどれだけ捗ったか。
Seleniumの公式ドキュメントはここ
探してもなかなか見つからなかった。
ここ。
https://seleniumhq.github.io/selenium/docs/api/javascript/index.html
公式ドキュメントを見るのが1番なので、Qiitaで知った気になっている人はこのリンク先だけ見ておけ。
ChromeのデベロッパーツールにXpathを作ってもらう
階層が深いDOMElementだったり、SPAでいろいろなコンポーネントを使ってサイトを作っていると、なかなかXPathを思ったとおりに指定するのが難しい。
そんな時は思考停止してChromeのデベロッパーツールを使ってXpathを取得しよう。
とはいえ @class
@id
で指定するほうが記述が簡潔になる場合が多い。
Chromeに頼りすぎるな。自分の頭で考えろ。
ChromeのデベロッパーツールでXpathを指定して要素を取得しよう
既存のテストを読んだところで指定されているXpathがどの要素を指定しているかわからない。そんな時はChromeデベロッパーツールを使えば要素を取得できる。
$x('xpath')
にXpathを渡してやれば要素を確認することができる。
WebElement#clear() 動いてなくね?
MaterialUIのコンポーネントだからなのかinput要素にsendKeys()
でテキストを送ることはできても、clear()
で削除することができない。なんなんこれ。
代替手段としての BACK_SPACE
キーを送信してテキストを削除する。
// e.g. sending back space.
import webdriver, { until, By, Key } from 'selenium-webdriver'
export const timeout = 15000
const drive = new webdriver.Builder()
.forBrowser('chrome')
.build()
driver
.findElement(By.xpath('//*[contains(@id,"name_input")]'))
.then(element => {
element.sendKeys.apply(element, [Key.chord(Key.CONTROL, "e"), ...(new Array(30).fill(Key.BACK_SPACE))])
element.sendKeys('new name')
})
この例では、まず Ctrl+e
を送信してカーソル位置を文字列の最後に移動させてから BACK_SPACE
を送信している。また、送信数も30回にしているが、このあたりは環境によって調整が必要。
詳しくはドキュメントを見ろ。