使用 python 在 selenium 和 phantomjs 中显式等待

explicit waits in selenium and phantomjs with python

我正试图从这个 site 和这个站点上的许多其他 "wines" 中抓取一些数据,并且我正在使用 selenium 作为它的一个 JS 站点来这样做.但是,我发现我的代码有时只能工作,有时它不会 return 任何值,即使没有任何变化。

我想我应该使用 selenium 的显式等待来克服这个挑战,但是我不确定如何集成它们,所以任何关于这样做的指导都会有所帮助!

我的密码是

def ct_content(url):
    browser = webdriver.PhantomJS()
    browser.get(url)
    wait = WebDriverWait(driver, 10)
    html = browser.page_source
    html = lxml.html.fromstring(html)
    try:
        content = html.xpath('//a[starts-with(@href, "list.asp?Table=List")]/text()')
        browser.quit()
        return content
    except:
        browser.quit()
        return False

谢谢!

看来您从未真正使用过隐式等待。这就是我编写带有显式等待的脚本的方式。

def ct_content(url):
    browser = webdriver.PhantomJS()
    browser.get(url)
    wait = WebDriverWait(browser, 10)
    try:
        content = wait.until(EC.element_to_be_clicable((By.XPATH, '//a[starts-with(@href, "list.asp?Table=List")]')))
        browser.quit()
        return content.text
    except:
        browser.quit()
        return False

另外,设置隐式等待的方法是:

browser.implicitly_wait(10) # seconds

尝试使用更具体的 XPath:

//ul[@class="twin_set_list"]//a/text()

也没有必要使用lxml。只需尝试:

from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC

data = [link.get_attribute('textContent') for link in wait(browser, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//ul[@class="twin_set_list"]//a')))]