する際に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])