Python Selenium驱动程序通过循环内的CSS选择器进行驱动

时间:2019-06-18 12:28:39

标签: python selenium

我正在抓取大量使用JS的页面,在其中选择了一个js按钮

driver.find_element_by_css_selector('.u-textColorDarker').click()

显示一个来自。在该表单内,会显示一些信息,但是要获取所有内容,需要单击n次按钮以显示所有内容(“显示更多”)。当没有其他可显示的内容时,按钮消失。

在此特定页面中,该按钮需要单击3次。因此,我的问题的快速解决方案是:

driver.find_element_by_css_selector('.js-showMoreRecommends').click()
time.sleep(2)
driver.find_element_by_css_selector('.js-showMoreRecommends').click()
time.sleep(2)
driver.find_element_by_css_selector('.js-showMoreRecommends').click()
time.sleep(2)

是否有一种方法可以将其放入循环中,以便在循环内完成操作,直到选择器'.js-showMoreRecommends'不再存在为止。

3 个答案:

答案 0 :(得分:2)

@mike-scotty写道:“使用while

建议使用WebDriverWait而不是time.sleep()

应该看起来像这样:

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

while WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".js-showMoreRecommends"))):
    show_more = WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".js-showMoreRecommends")))
    show_more.click()

答案 1 :(得分:2)

是的,您可以使用预期的条件。

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

driver = webdriver.Firefox()
driver.get("http://somedomain/url")

while not EC.invisibility_of_element_located((By.CSS_SELECTOR, ".js-showMoreRecommends")):
    driver.find_element_by_css_selector('.js-showMoreRecommends').click()

我是从内存中写出来的,但这应该为您指明了总体方向。 关键是预期条件方法EC.invisibility_of_element_located。它将为您提供一个布尔值,以确定它是否不存在。

答案 2 :(得分:1)

装有while true循环,您可以在显示按钮时尝试while循环

while driver.find_element_by_css_selector('.js-showMoreRecommends').is_displayed():
    driver.find_element_by_css_selector('.js-showMoreRecommends').click()
    time.sleep(2)