【问题标题】:Cannot scroll element to view and click. Python Selenium无法滚动元素以查看和单击。蟒蛇硒
【发布时间】:2020-12-27 16:39:59
【问题描述】:

我正在尝试从此页面获取附加组件。如果项目是可定制的

https://www.swiggy.com/restaurants/imperial-restaurant-shivajinagar-central-bangalore-bangalore-48556

收集完所有divs后,我尝试转到页面顶部(不起作用)。我检查 customisable div 是否存在。如果是这样,请将其滚动到视图中,单击“添加”按钮并获取“添加详细信息”。我试过了,actionChains,没用。 execute_script 也不做任何事情。单击之前可以正常工作,但是向上和向下滚动页面有点搞砸了。几个小时以来一直在努力解决这个问题。非常感谢任何帮助。

    for i in range(6):
        item_dvs = driver.find_elements_by_class_name('_2wg_t')
        driver.execute_script("window.scrollBy(0, 3100)")
    driver.execute_script("window.scrollBy(0,-18500);")
    for div in item_dvs:
        try:
            name = div.find_element_by_class_name('styles_itemNameText__3bcKX')
            price = div.find_element_by_class_name('rupee')
            if div.find_elements_by_class_name('styles_itemDesc__MTsVd'):
                desc = div.find_element_by_class_name('styles_itemDesc__MTsVd').text
            else:
                desc = None
            is_cust = div.find_element_by_class_name('_1C1Fl _23qjy')
            if is_cust:
                driver.execute_script("arguments[0].scrollIntoView();", is_cust)

【问题讨论】:

    标签: python python-3.x selenium web-scraping


    【解决方案1】:

    首先,我建议你使用WebDriverWait,因为当元素不存在时,if div.find_elements_by_class_name('styles_itemDesc__MTsVd')is_cust = div.find_element_by_class_name('_1C1Fl _23qjy') 行会抛出异常。使用WebDriverWait 的另一个原因是等待“添加”按钮可点击。这是解决这两个问题的解决方案,您可以使用 try/catch 来处理描述和“可自定义”元素的存在,您可以等待“添加”按钮可点击:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as ec
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium.common.exceptions import TimeoutException
    
    
    driver = webdriver.Chrome()
    driver.get("https://www.swiggy.com/restaurants/imperial-restaurant-shivajinagar-central-bangalore-bangalore-48556")
    wait = WebDriverWait(driver, 10)
    
    try:
        item_dvs = []
        for i in range(6):
            item_dvs = wait.until(ec.visibility_of_all_elements_located((By.CLASS_NAME, '_2wg_t')))
            driver.execute_script("window.scrollBy(0, 3100)")
        driver.execute_script("window.scrollBy(0,-18500);")
    
        for div in item_dvs:
            wait_div = WebDriverWait(div, 10)
            name = wait_div.until(ec.visibility_of_element_located((By.CLASS_NAME, 'styles_itemNameText__3bcKX')))
            price = wait_div.until(ec.visibility_of_element_located((By.CLASS_NAME, 'rupee')))
    
            try:
                desc = wait_div.until(ec.visibility_of_element_located((By.XPATH, ".//div[contains(@class, 'styles_itemDesc__MTsVd')]"))).text
            except TimeoutException:
                desc = None
    
            try:
                is_cust = wait_div.until(ec.visibility_of_element_located((By.XPATH, ".//div[contains(@class, '_1C1Fl _23qjy')]")))
                add_on = wait_div.until(ec.element_to_be_clickable((By.XPATH, ".//div[contains(@class, 'F8dpS _3L1X9')]")))
                ActionChains(driver).move_to_element(add_on).click().perform()
                # get add on details
                # close add window
            except TimeoutException:
                pass
    
        driver.close()
    
    except Exception as e:
        driver.close()
        raise e
    

    【讨论】:

    • 不工作的人。不点击添加。
    • 你等了多久?因为对于第一个元素,驱动程序找不到描述,所以您必须等待至少 10 秒。我自己尝试了代码,它工作正常。添加按钮是指.//div[contains(@class, 'F8dpS _3L1X9')] 处的按钮吗?
    • 这不是wait 的问题。这段代码运行良好。我现在修好了。将找不到多个类名。我应该使用xpath。是_cust = div.find_element_by_xpath('//div[@class="_1C1Fl _23qjy"]')。这行得通。非常感谢您的帮助。
    • 是的,当然,我也在那个 xpath 的答案中写了它。如果您想将答案标记为适合您的答案
    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2021-08-06
    • 2016-05-28
    • 2021-06-28
    • 2021-10-11
    • 2021-07-07
    • 2023-02-06
    相关资源
    最近更新 更多