Python Selenium - 等待表单提交后加载下一页

fig*_*r20 8 python selenium selenium-webdriver

我使用Python3和Selenium firefox提交表单,然后获取他们随后登陆的URL.我是这样做的

inputElement.send_keys(postnumber)
inputElement.submit()

time.sleep(5)

# Get Current URL
current_url = driver.current_url
print ( " URL : %s" % current_url )
Run Code Online (Sandbox Code Playgroud)

这大部分时间都在工作,但有时页面加载时间超过5秒,我得到旧URL,因为新的URL还没有加载.

我该怎么做?

Bry*_*ley 7

在我的代码中,我创建了一个上下文管理器,它执行以下操作:

  • 获得对'html'元素的引用
  • 提交表格
  • 等到对html元素的引用变得陈旧(这意味着页面已经开始重新加载)
  • 等待document.readyState"完成"(这意味着页面已完成初始加载)

如果页面中包含使用其他ajax调用填充的内容,我可能会在此之后添加另一个等待的元素,我知道在上述四个步骤之后不会立即显示该元素.

有关详细说明,请参阅此博客文章:如何让Selenium在单击后等待页面加载


Ale*_*Che 6

url_changes的帮助者expected_conditions正是出于此目的:

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

# some work on current page, code omitted

# save current page url
current_url = driver.current_url

# initiate page transition, e.g.:
input_element.send_keys(post_number)
input_element.submit()

# wait for URL to change with 15 seconds timeout
WebDriverWait(driver, 15).until(EC.url_changes(current_url))

# print new URL
new_url = driver.current_url
print(new_url)
Run Code Online (Sandbox Code Playgroud)

  • 如果目标页面的 URL 与当前页面的 URL 相同,也无效。 (3认同)
  • 大部分时间都有效,但在重定向到登录页面时无效。 (2认同)

And*_*son 3

尝试以下方法:

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

title = driver.title
inputElement.send_keys(postnumber)
inputElement.submit()
wait(driver, 15).until_not(EC.title_is(title))
current_url = driver.current_url
print ( " URL : %s" % current_url )
Run Code Online (Sandbox Code Playgroud)

这将允许您在提交表单后最多等待 15 秒,直到页面标题发生更改(以防新旧页面上有不同的标题URL) 。如果您想处理新页面上的元素,那么您可能需要使用以下代码:

inputElement.send_keys(postnumber)
inputElement.submit()
text_of_element_on_new_page = wait(driver, 15).until(EC.presence_of_element_located((By.ID, "some_element_id"))).text

print ( " Text of element is : %s" % text_of_element_on_new_page )
Run Code Online (Sandbox Code Playgroud)

  • 您应该指出,只有当新页面的标题与当前页面不同时,此解决方案才有效。我在几个系统上工作过,但情况并非如此。 (2认同)