🐕

クリックが動かない:令和時代にSelniumでIEを動かす(2)

2021/08/08に公開

nativeEventをfalseにする

関連記事:
令和時代にSelniumでIEを動かす(1)
クリックが動かない:令和時代にSelniumでIEを動かす(2)

------------------- ↓ 前書はここから ↓-------------------

前回の記事でIEは起動したものの、
各種エミュレーション機能がまともに動かない。
(もちろんChrome, Firefoxでは問題なく動く)

[selenium ie click]で検索してみると、
not workingの文字が乱舞している。。。

(・_・) 困った。
これでは使い物にならない。。。
こんなページがある。

Selenium2のWebDriverでIEを操作したときの問題と対応まとめ

(ノ∀`)アチャー

対処療法の嵐。
クリックの前にfocus当てるとか、
空文字を送信しておくとか、
とても使い物にならない。

さて、本当にどうにもならないのか調べてみたら、
ちょっといけるかもというのがあった。
それが

nativeEvent = false

[Selenium]の公式にあるDesiredCapabilitiesの欄にあるパラメータをいろいろ試した。
CapabilitiesってのはWebdriverに渡す起動パラメータみたいなもので、
共通部とブラウザ固有部がある。
その中の以下の三つは調べるとよく出てくる

  • nativeEvents
  • requireWindowFocus
  • enablePersistentHover

一つ一つ切り替えながら試すと、どうやらnativeEventsが問題らしい
これを踏まえたうえで実行してみよう。

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

各種パッケージをインストール

npm i -D selenium-webdriver iedriver

Googleの検索をエミュレートしてみる

Googleにアクセスして検索ボックスに適当な文字列を入力
検索結果が表示されるという簡単なシナリオ。

searchgoogle.cjs
// Generated by Selenium IDE
(async () => {
  const {Builder, By, Key, until, Capabilities} = require("selenium-webdriver")
  const ie = require('selenium-webdriver/ie')

  let service = new ie.ServiceBuilder("node_modules/iedriver/lib/iedriver/IEDriverServer.exe")
  let options = new ie.Options();
  options.set('se:ieOptions', {
    nativeEvents: false,
  })
  let driver = await new Builder()
                .setIeService(service)
                .forBrowser('internet explorer')
                .setIeOptions(options)
                .build()
  let vars = {}
    await driver.get('http://www.google.co.jp');
    await driver.findElement(By.name("q")).click()
    await driver.findElement(By.name("q")).sendKeys("Selenium", Key.RETURN)
    await driver.sleep(3000)
    await driver.close()
    await driver.quit();
})()

実行

node searchgoogle.cjs

(´▽`)Yes!Google!

------------------- ↓ 後書きはここから ↓-------------------

ポイントはこの辺りか。

  let options = new ie.Options();
  options.set('se:ieOptions', {
    nativeEvents: false,
  })
・・・  
  let driver = await new Builder()
                .setIeOptions(options)

検索しても全然でてこないし。

Discussion