Python Selenium:等到元素可点击 - 使用 find_elements 找到元素

Python Selenium: Wait until element is clickable - Element is found using find_elements

我正在构建一个网络抓取工具,它循环访问地址列表并在 属性 网站上搜索它们。然后,它会根据我们已知的有关房产的信息更新一些下拉列表,然后再收集各种信息,例如预期租金收益。

搜索完每个地址后,可能需要一些时间才能将所需元素(例如,'bathrooms_dropdown')加载到网站上。我一直在使用 time.sleep(x) 进行管理,但这很慢且不可靠,而且 implictly_wait(60) 似乎没有任何效果,因为我仍然经常收到 'element does not exist / could not be found' 错误。

我确定我需要实现 WebDriverWait,但是在将它实现到我的代码中时无法计算出语法。我没有看到与 driver.find_elements()

结合使用的示例

如有任何帮助,我们将不胜感激!

driver.get(url)
driver.implicitly_wait(60)   

# find search bar and search for address
searchBar = driver.find_element(by = By.ID, value = 'react-select-3-input')
searchBar.send_keys(address)
searchButton = driver.find_element(By.CLASS_NAME, value='sc-1mx0n6y-0').click()

# wait for elements to load
time.sleep(3) # REPLACE THIS

# find dropdown and click to open it
bathrooms_dropdown = driver.find_elements(By.CLASS_NAME, value = 'css-19bqh2r')[-2]
bathrooms_dropdown.click()  

您需要注意以下几件事:

  • 因为 searchBar 元素是 clickable 元素需要你需要诱导 WebDriverWait for the 如下:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "react-select-3-input"))).send_keys(address)
    
  • 同样,由于 searchButton 元素是 clickable 元素,您您需要为 element_to_be_clickable() 引入 如下(在最坏的情况下,假设在填充搜索文本时启用了 searchButton):

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CLASS_NAME, "sc-1mx0n6y-0"))).click()
    
  • 理想的下拉菜单是 tags and ideally you should be using the Select class inducing 如下:

    Select(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "cssSelector_select_element")))).select_by_visible_text("visible_text")
    
  • 最后,您使用的 IDCLASS_NAME 值,例如react-select-3-输入,sc-1mx0n6y-0 css-19bqh2r 等看起来是动态的,并且可能会在您重新访问该应用程序或简而言之时发生变化间隔。因此,您可以选择寻找其他一些静态属性。

  • 注意:您必须添加以下导入:

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