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)