【问题标题】:Waiting to scroll to an object before scrolling to it for Python Selenium Webdriver在为 Python Selenium Webdriver 滚动到它之前等待滚动到一个对象
【发布时间】:2016-07-05 11:42:56
【问题描述】:

我编写了一个函数,用户输入要使用的策略类型(即 By.XPATH、By.ID、By.NAME 等)以及该对象应该存在的地址,该函数将选择要使用的 Selenium 方法、定位对象并将其滚动到视图中。

    view_object(driver, type, address):
        strategy = {
            "css_selector": driver.find_element_by_css_selector,
            "id":           driver.find_element_by_id,
            "link_text":    driver.find_element_by_link_text,
            "name":         driver.find_element_by_name,
            "xpath":        driver.find_element_by_xpath
            }
        lhsType, rhsType = type.split(".", 1)
        find_element = strategy.get(rhsType.lower())

        obj = find_element(address)
        driver.execute_script("return arguments[0].scrollIntoView();", obj)

我创建这个函数的原因与我在 Firefox 或 Chrome 上没有失败的 Internet Explorer (IE) 上运行失败的测试有关。经过一番调查,我得出结论,只要我尝试测试需要首先滚动到页面并使其可见的对象,就会发生故障。

不管怎样,回到问题上来。我遇到代码在“obj = find_element(element)”行失败的情况,因为加载对象大约需要 30-45 秒。

为了解决这个问题,我相信我需要创建一个类,使这行代码可以使用 Selenium WebDriverWait(driver, time) 方法,然后它就会有一个分配的在失败之前尝试此操作的时间量。我该怎么办?

【问题讨论】:

    标签: python selenium selenium-webdriver webdriver


    【解决方案1】:

    您也可以使用implicitly_wait。在这种情况下,您不必更改您的功能。缺点是驱动程序在定位元素时每次都会等待指定的时间,这并不总是需要的。

    隐式等待是告诉 WebDriver 轮询 DOM 尝试查找一个或多个元素(如果它们是)时的时间量 无法立即使用。默认设置为 0。一旦设置, 为 WebDriver 对象实例的生命周期设置了隐式等待。

    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.implicitly_wait(60)
    


    或者您可以根据您的要求具体说明

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    
    def view_object(driver, type, address):
        strategy = {
            "css_selector": By.CSS_SELECTOR
            "id":           By.ID,
            "link_text":    By.LINK_TEXT,
            "name":         By.NAME,
            "xpath":        By.XPATH
            }
        lhsType, rhsType = type.split(".", 1)
        find_element = strategy.get(rhsType.lower())
    
        wait = WebDriverWait(driver, 60)
        obj = wait.until(EC.presence_of_element_located((find_element, address)))
        driver.execute_script("return arguments[0].scrollIntoView();", obj)
    

    【讨论】:

      猜你喜欢
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 2019-08-10
      • 2017-02-13
      • 2017-06-22
      • 2017-01-03
      相关资源
      最近更新 更多