zoukankan      html  css  js  c++  java
  • 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)
    
    
  • 相关阅读:
    链堆栈的实现
    关于HyperLink的NavigateUrl属性的链接地址参数设置
    //yield return用于无缝实现迭代模式。
    NUnit的使用
    非常不错的数据访问架构
    Dictionary应用
    针对数据分析没态度的几句牢骚
    微软算法面试题(4)
    程序员面试题精选100题(60)判断二叉树是不是平衡的
    C++设计模式单件
  • 原文地址:https://www.cnblogs.com/hbym/p/15788566.html
Copyright © 2011-2022 走看看