python selenium:不要等到click()命令之后加载页面

2024-03-28 22:45:01 发布

您现在位置:Python中文网/ 问答频道 /正文

有人知道如何等到页面加载?我尝试了所有可能的变种,我发现在网上,但只是不工作。

我需要在触发click()命令后等待,web服务器上有一些内部脚本,这些脚本会进行傻瓜式检查,例如(我排除导入所需模块的代码,并使用标准命名约定):

WebDriverWait(browser, 10).until(lambda d: d.find_element_by_id(the_id))

或者

browser.implicitly_wait(10) 

或者

elem2=wait.until(EC.presence_of_element_located((By.ID,the_id)))

上述所有检查都不起作用,因为即使页面仍在加载,它们也会返回True。这会导致我正在读取的文本不完整,因为在click()命令之后页面未完全加载。在python中,命令clickAndWait似乎不可用(但同样,它可能无法解决问题,因为其他测试也会失败)。理想情况下,会有一个命令等待整个web页面被加载(不管页面的某个特定元素如何)。

我设法通过在循环中手动插入一个time.sleep(5)来解决这个问题,但这是次优的,因为它可能会减慢整个过程。如果可能的话,最好只等严格要求的时间。

泰铢


Tags: 模块the命令browser服务器脚本webid
2条回答

这是我用过的版本:

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

def waitForLoad(inputXPath): 
    Wait = WebDriverWait(browser, PATIENCE_TIME)       
    Wait.until(EC.presence_of_element_located((By.XPATH, inputXPath)))

函数的第一行是一般等待。第二个是期望的条件,它试图找到一个您知道存在于页面上的元素。您可以更改它,以便它代替Xpath执行CSS_选择器、名称、ID、类等操作。还有许多其他操作,但您必须查阅预期条件文档。希望这对我有帮助,当我想出来的时候。

基本上,如果页面是由JavaScript生成的,那么就无法判断它何时“完成”了加载。

然而。我通常尝试检索一个页面元素,捕捉异常并继续尝试,直到达到超时。我还可以检查元素是否可见,而不仅仅是存在的。

必须有一些DOM元素的可见性可用于测试页是否已“完成”加载。在我的测试用例中,我通常有一个wait_for_element_visibility,和wait_for_element_presence函数。

def wait_for_visibility(self, selector, timeout_seconds=10):
    retries = timeout_seconds
    while retries:
        try:
            element = self.get_via_css(selector)
            if element.is_displayed():
                return element
        except (exceptions.NoSuchElementException,
                exceptions.StaleElementReferenceException):
            if retries <= 0:
                raise
            else:
                pass

        retries = retries - 1
        time.sleep(pause_interval)
    raise exceptions.ElementNotVisibleException(
        "Element %s not visible despite waiting for %s seconds" % (
            selector, timeout_seconds)
    )

get_via_css是我自己的函数之一,但我希望它非常清楚它在做什么。

相关问题 更多 >