Note that there are some explanatory texts on larger screens.

plurals
  1. POPython bindings to Selenium Webdriver: ActionChain not executing in PhantomJS
    text
    copied!<p>Using PhantomJS, the ActionChain shown below never executes:</p> <pre><code>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 &gt;&gt; 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 &gt;&gt; sys.stderr, 'comments are loading, (%s, %s)' % \ (load_more_div.value_of_css_property('display'), load_more_button.get_attribute('class')) else: print &gt;&gt; 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 &gt;&gt; sys.stderr, '(%s, %s)' % (load_more_div.value_of_css_property('display'), load_more_button.get_attribute('class')) print wd.page_source wd.quit() </code></pre> <p>Running using Firefox prints this output to stderr, which is correct:</p> <pre><code>(block, btn) comments are loading, (block, btn busy) comments are loading, (block, btn busy) comments done loading (none, btn) (none, btn) </code></pre> <p>But running using PhantomJS prints this output to stderr, which is incorrect:</p> <pre><code>(block, btn) comments done loading (block, btn) (block, btn) </code></pre> <p>I would like to be able to use the ActionChain version for the application that I'm writing, but also need to use PhantomJS. Any ideas why the ActionChain does not execute using the PhantomJS webdriver?</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload