硒隐式和显式等待不起作用/无效

时间:2018-07-14 08:49:02

标签: python-3.x selenium

input

它只是在页面加载后退出。等待完全没有效果!

演示:https://www.youtube.com/watch?v=GocfsDZFqk8&feature=youtu.be

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

如果您想暂停10秒钟,请使用time.sleep()

import time

time.sleep(10) # take a pause 10 seconds

注意: WebDriverWait(driver,10)不能那样工作。相反,您可以像这样使用它:

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

# this will wait at least 10 seconds until url will contain "your_url"
WebDriverWait(driver, 10).until(EC.url_contains(("your_url")))

,但不会等到10秒钟,直到满足expected_conditions为止。

还: ,正如我们告诉的源代码:

def implicitly_wait(self, time_to_wait):
    """
    Sets a sticky timeout to implicitly wait for an element to be found,
       or a command to complete. This method only needs to be called one
       time per session. To set the timeout for calls to
       execute_async_script, see set_script_timeout.

    :Args:
     - time_to_wait: Amount of time to wait (in seconds)

    :Usage:
        driver.implicitly_wait(30)
    """
    ...

driver.implicitly_wait(10)也用于等待元素,而不是暂停脚本。

PS: :使用WebDriverWait而不是硬暂停始终是一个好习惯,因为有了WebDriverWait,您的测试会更快,因为您不必等待整个时间,而只需等到expected_conditions就可以了。据我了解,您目前只是在玩游戏,但将来WebDriverWait更好用。

答案 1 :(得分:1)

使用此WebDriverWait(driver,10),您已经声明了显式等待。这只是声明,您根本没有使用显式等待。

要使用显式等待,您必须将以上代码与 EC 绑定,即Expected condition

类似:

wait = WebDriverWait(driver,10)
element = wait.until(EC.element_to_be_clickable((By.NAME, 'q')))
element.send_keys("Hi Google")  

您可以参考此链接进行明确等待Explicit wait

请注意,time.sleep(10)worst/extreme类型的显式等待,它将条件设置为确切的等待时间。提供了一些方便的方法,可以帮助您编写仅等待所需时间的代码。将WebDriverWait与ExpectedCondition结合是实现此目的的一种方法。

答案 2 :(得分:1)

因此,我们遇到了同样的问题,我们所做的就是用装饰器修改selenium中的驱动程序类,使其在get_driver()函数中修改的函数上睡眠0.44秒。在这种情况下,我们希望在硒输入所需的内容之前等待通过类,名称和ID查找元素。像魅力一样工作。

def sleep_decorator(func):
    def wrapper(*args, **kwargs):
        time.sleep(.44)                      # Added side-effect
        return func(*args, **kwargs)         # Modified return
    return wrapper


def get_driver():
    driver = webdriver.Chrome()
    driver.find_element_by_id = sleep_decorator(driver.find_element_by_id)
    driver.find_element_by_name = sleep_decorator(driver.find_element_by_name)
    driver.find_element_by_class_name = sleep_decorator(driver.find_element_by_class_name)
    driver.find_elements_by_id = sleep_decorator(driver.find_elements_by_id)
    driver.find_elements_by_name = sleep_decorator(driver.find_elements_by_name)
    driver.find_elements_by_class_name = sleep_decorator(driver.find_elements_by_class_name)
    return driver