PhantomJS を使用すると、以下に示す ActionChain は実行されません。
import sys
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# have PhantomJS pretend to be Firefox to make things more equal
desired_capabilities = dict(DesiredCapabilities.PHANTOMJS)
desired_capabilities["phantomjs.page.settings.userAgent"] = (
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) '
'Gecko/20100101 Firefox/21.0'
)
wd = webdriver.PhantomJS(desired_capabilities=desired_capabilities)
# wd = webdriver.Firefox()
# get a page with some AJAXy comments
wd.get('http://www.cartoonbrew.com/disney/disneys-princess-makeover-of-merida-leads-to-uproar-and-petition-82636.html')
# switch to iframe with comments
wd.switch_to_frame('dsq1')
# these selectors are used throughout
load_more_div_selector = "//div[@class='load-more']"
load_more_button_selector = "//div[@class='load-more']/a"
# wait until the comments are loaded
WebDriverWait(wd, 10, 0.1).until(
EC.presence_of_element_located((By.XPATH, load_more_div_selector))
)
# print out the status of the load more button (the display is 'block'
# if there are more comments to be loaded), and the button should have
# the class 'btn'
load_more_div = wd.find_element_by_xpath(load_more_div_selector)
load_more_button = wd.find_element_by_xpath(load_more_button_selector)
print >> sys.stderr, '(%s, %s)' % (load_more_div.value_of_css_property('display'), load_more_button.get_attribute('class'))
# click on the 'load more comments' button
action_chain = ActionChains(wd).click(on_element=load_more_button)
action_chain.perform()
# wait until the comments are loaded
def comments_no_longer_loading(wd):
load_more_div = wd.find_element_by_xpath(load_more_div_selector)
load_more_button = wd.find_element_by_xpath(load_more_button_selector)
is_loading = 'busy' in load_more_button.get_attribute('class')
if is_loading:
print >> sys.stderr, 'comments are loading, (%s, %s)' % \
(load_more_div.value_of_css_property('display'),
load_more_button.get_attribute('class'))
else:
print >> sys.stderr, 'comments done loading (%s, %s)' % \
(load_more_div.value_of_css_property('display'),
load_more_button.get_attribute('class'))
return not is_loading
# wait until comments are loaded
WebDriverWait(wd, 10, 0.1).until(comments_no_longer_loading)
# print out the status of the button
load_more_div = wd.find_element_by_xpath(load_more_div_selector)
load_more_button = wd.find_element_by_xpath(load_more_button_selector)
print >> sys.stderr, '(%s, %s)' % (load_more_div.value_of_css_property('display'), load_more_button.get_attribute('class'))
print wd.page_source
wd.quit()
Firefox を使用して実行すると、次の出力が stderr に出力されます。これは正しいです。
(block, btn)
comments are loading, (block, btn busy)
comments are loading, (block, btn busy)
comments done loading (none, btn)
(none, btn)
しかし、PhantomJS を使用して実行すると、この出力が stderr に出力されますが、これは正しくありません。
(block, btn)
comments done loading (block, btn)
(block, btn)
私が書いているアプリケーションに ActionChain バージョンを使用できるようにしたいのですが、PhantomJS も使用する必要があります。PhantomJS Webdriver を使用して ActionChain が実行されない理由はありますか?