Selenium Python:如何在单击后等待页面加载?

16

我想在点击后获取页面的源代码,然后使用浏览器返回(browser.back())函数返回。但是Selenium不允许在单击后完全加载页面,并且由JavaScript生成的内容未包含在该页面的页面源代码中。

element[i].click()
#Need to wait here until the content is fully generated by JS.
#And then grab the page source.
scoreCardHTML  = browser.page_source
browser.back()

你可以选择一个特定的元素,然后等待它出现再执行操作,这样整个页面也会加载完成。但是可能有更好的方法来实现这一点。 - VlassisFo
你是在说显式等待吗? - abhanan93
你有没有谷歌过自己的问题?我谷歌了一下,第一个结果就是你的确切问题... http://www.obeythetestinggoat.com/how-to-get-selenium-to-wait-for-page-load-after-a-click.html - JeffC
请参考Python Selenium - Wait until next page has loaded after form submit - Stack Overflow,其中提供了一些其他(可能更好的)方法。 - user202729
4个回答

15

正如Alan提到的那样 - 你可以等待某个元素被加载。以下是示例代码:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Firefox()
element = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, "element_id")))

我也可以通过类名等待元素的出现吗?'By.CLASS_NAME'...这是用于定位类名的正确语法吗? - abhanan93
@abhanan93 你可以使用任何可以用来查找元素的方式进行等待。 - RemcoW
如果您期望使用该类的更多元素,您可以使用presence_of_all_elements_located代替。 - wisnia
虽然页面已经完全加载并且我已经完全获取了HTML,但使用显式等待时,我仍然遇到了此错误消息。TimeoutException:Message:Stacktrace:at FirefoxDriver.prototype.findElementInternal_(file:///tmp/tmpQIQukJ/extensions/fxdriver@googlecode.com/components/driver-component.js:10770) - abhanan93
如果代码不太长的话,您可以在这里发布整个代码或者使用 Pastebin。 - wisnia

4

您也可以使用Selenium的staleness_of方法

from selenium.webdriver.support.expected_conditions import staleness_of

def wait_for_page_load(browser, timeout=30):
    old_page = browser.find_element_by_tag_name('html')
    yield
    WebDriverWait(browser, timeout).until(
        staleness_of(old_page)
    )

2
yield语句是什么意思? - wamster

3
您可以使用尝试等待循环的方法来完成,这是一种易于实现的方法。
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("url")
Button=''
while not Button:
    try:
        Button=browser.find_element_by_name('NAME OF ELEMENT')
        Button.click()
    except:continue

3
无限循环很少是答案。 - SMKS

0
假设“pass”是当前页面中的一个元素,并且不会出现在目标页面中。我大多数时候使用我将要点击的链接的ID,因为它很少出现在目标页面中。
while True:
  try:
    browser.find_element_by_id("pass")
  except:
    break

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接