Selenium爬虫过程中解决的,window窗口问题

window窗口句柄只能到该窗口的最大页码处,之后再点击下一页会返回到第一页的问题。
这个问题,可以理解为窗口句柄被写死不能刷新,要解决这个,先得保存句柄,搞两个句柄,
一个句柄用来翻页的,一个句柄用来窗口操作的,试了好久解决的。

   
    while True:
        driver.implicitly_wait(10)  # 10s加载时长
        # 提取所有的url和标题
        # todo 先将该列表从上到下走一下
        # wait = WebDriverWait(driver, 10)
        # div = wait.until(EC.presence_of_all_elements_located((By.XPATH, meta['list_rule']))) #显示等待,只要出现了div就不出异常
        for i in range(3):
            
            driver.find_element_by_tag_name('body').send_keys(Keys.END)
            sleep(1)
        list_element = driver.find_elements(By.XPATH, meta['list_rule'])
        # 打开所有的窗口 
        # current_window = driver.current_window_handle
        driver1 = driver  # 保存driver,这个地方的driver1就被我用来专门翻页的句柄,其他操作都是用driver进行的
        deal_window(list_element, driver, meta)  
        try:
            # next_page_link.click()
            # 下一页换种方式获取
            current_page = driver1.find_element(By.XPATH, meta['current_page'])
            print(f'当前页数是 {current_page.text} 页')
            # if int(current_page.text + 1) < flag_page:
            #     print(flag_page, current_page.text+1)
            #     break
            # btn = driver.find_element_by_css_selector('a.n:last-child')
             # 翻页 1
            next_element = driver1.find_element(By.XPATH, meta['next_page'])
            driver1.execute_script("arguments[0].scrollIntoView();", next_element)  # 页面滚动到下一页
            if next_element:
                next_element.click()


            # 翻页2
            # next_page_link = driver.find_element_by_link_text('下一页')
            # driver.execute_script("arguments[0].scrollIntoView();", next_page_link)  # 页面滚动到下一页
            # if next_page_link:
            #     next_page_link.click()
           # 翻页3
            # next_page = driver.find_element(By.XPATH, "//a[contains(text(),'下一页')]")
            # if next_page:
            #     # 还存在下一页
            #     webdriver.ActionChains(driver).move_to_element(next_page).click(next_page).perform()
            # else:
            #     print('没有下一页')
            #     break
        except Exception as e:
            print('没有了下一页,break 掉了')
            break
    print('ok all over ')
    driver.quit()


def deal_window(list_element, driver, meta):
    try:
        driver2 = driver
        driver2.implicitly_wait(5)
        current_window = driver2.current_window_handle
        print(f' list_element size {len(list_element)}')
        for element in list_element:
            try:
                # 方式一
                # element.send_keys(Keys.ENTER)  
                # 方式二
                # print('-'*10, element.get_attribute('href'))
                # js = f"window.open('{element.get_attribute('href')}')"
                # driver2.execute_script(js)
                # 方式三
                if element.is_enabled():
                    element.click()
            except Exception as e:
                print('problem is in this')
                continue
                print(e)
        windows = driver.window_handles
        print(f' windows size: {len(windows)}')
        for handle in windows:
            if handle != current_window:
                try:
                    driver.switch_to.window(handle)
                    print('~~~~~~~~~~切换窗口成功~~~~~~~~~~~~')
                    # 隐式等待,20s不出现关闭
                    # driver.implicitly_wait(5)
                    # get_content_new(driver, meta) 
                    print('close window is future')
                    driver.close()
                    print('close window success')
                except Exception as e:
                    try:
                        driver.close()
                    except Exception as e:
                        print('exception close window2 ')
                    continue
        driver2.switch_to.window(current_window)
        # 删除
        del list_element
    except Exception as e:
        print('exception-------driver must close---------------------------')
        print(e)

posted @ 2022-01-11 15:31  堕落先锋  阅读(325)  评论(0编辑  收藏  举报