Python 绑定(bind)到 Selenium Webdriver : ActionChain not executing in PhantomJS

标签 python selenium webdriver phantomjs

使用 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。知道为什么 ActionChain 不使用 PhantomJS Webdriver 执行吗?

最佳答案

我无法判断您的真实网站出了什么问题,但对于 http://example.com 我相信这只是时间问题。在print wd.current_url之前添加time.sleep(5),你应该能够得到正确的url。

import time

# your code
# ...

ActionChains(wd).click(on_element=button).perform() 
time.sleep(5)
print wd.current_url

(如果您想做一些真正的事情,请删除 sleep 并使用 WebDriverWait。)

关于Python 绑定(bind)到 Selenium Webdriver : ActionChain not executing in PhantomJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16744038/

相关文章:

python - 'from pylons import config' 和 'import pylons.config' 之间的区别

java - 如何在 Java 中抛出自定义的 block 异常

WebDriver - Chrome - 排除开关列表

python - 如何直接在屏幕上绘制一个像素点?

python - 根据 Pandas Dataframe 中另一列的内容在一列上运行操作

testing - Selenium 在 XPath 中找不到 SVG 元素

java - 页面对象模型 Selenium,将等待添加到测试类中

javascript - Webdriver:使用 JS 将 key 发送到 Canvas

java - 如何从时间中获取秒和毫秒?

python - 如何处理TypeError : __call__() takes at least 2 arguments (1 given)?