py-py’s blog

何か書くよ

seleniumでキーを押しながら要素をクリック

する際にActionChainsに、seleniumで取得した要素をつっこんで怒られていた話。

ActionChainsに突っ込むのはdriverで、取得した要素を突っ込むのはActionChainsオブジェクトの関数click()

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains


url = ""
driver = webdriver.PhantomJS() # Chromeでも大丈夫
driver.get(url)

elements = driver.find_elements_by_xpath(xpath)
for element in elements:
    actions = ActionChains(driver)
    actions.key_down(Keys.CONTROL)
    actions.click(element)
    actions.perform()
    # 新規タブへ移動する
    driver.switch_to.window(driver.window_handles[1])
    # 何らかの処理
    # タブを閉じる
    driver.close()
    driver.switch_to.window(driver.window_handles[0])

これでCtrlを押しながらのクリックとなる

のだが、for文内でのCtrl押下のクリックが一度しか実行されない。。

close()し、元のページに戻ったら別要素を指定してCtrl押下のクリックすると思いきや

通常のクリックになってしまう。

上記のコードだとcontrol keyが押しっぱなしになっているため、できなかった。

修正したコードは以下。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains


url = ""
driver = webdriver.PhantomJS()
driver.get(url)

elements = driver.find_elements_by_xpath(xpath)
for element in elements:
    actions = ActionChains(driver)
    actions.key_down(Keys.CONTROL)
    actions.click(element)
    actions.key_up(Keys.CONTROL) # <-- こいつが必要だった
    actions.perform()
    driver.switch_to.window(driver.window_handles[1])
    driver.close()
    driver.switch_to.window(driver.window_handles[0])