【问题标题】:Browser.close() with a loop to open a new windowBrowser.close() 循环打开一个新窗口
【发布时间】:2020-03-23 01:45:21
【问题描述】:

我正在寻求帮助以使用 selenium 运行循环。我想打开一个主页,然后单击链接时打开一个窗口,然后切换到新窗口,然后关闭新窗口以切换回主页。我的目标是多次执行此操作,但是当我运行代码时,它会运行一次(for k=0),然后我收到以下错误消息:

  File "/Users/al/Desktop/code.py", line 34, in <module>
  window_after = browser.window_handles[x+1]

  IndexError: list index out of range

如果有人知道如何执行完整的代码,那就太好了!! 谢谢。

这是我要运行的代码:

import time
import re
import traceback
import sys
import csv
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
from random import randint
from lxml import etree
from lxml.cssselect import CSSSelector
import bs4 as bs
from selenium import webdriver
from selenium.webdriver.support.ui import Select
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.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
browser = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver')
browser.get('https://www.vivino.com/explore?e=eJwdizsKgDAUBG-zdRQst9QDBKzEIj5jCPhUovi5vdFqYGdHEwtoXGig7mZlDORhYyGsW4st2zDxdCn6w81QIdaBW4risXL0u-A6uj7ffpS53jOnhPCt5gXGoR73')
list1=browser.find_elements_by_xpath('//*/div[@class="explorerCard__explorerCard--3Q7_0 explorerPageResults__explorerCard--3q6Qe"]/div[2]/div/a/span[2]')
for k in list1:
    time.sleep(2.5)
    k.click()
    time.sleep(2)
    x=list1.index(k)
    print(x)
    window_after = browser.window_handles[x+1]
    browser.switch_to_window(window_after)
    browser.close()
    browser.switch_to_window(browser.window_handles[0])

【问题讨论】:

  • window_handles 列表中的索引“x+1”上没有项目。 windows_handles的调试内容,你是从0开始数的吗?

标签: python selenium selenium-webdriver


【解决方案1】:

IndexError: 列表索引超出范围

出现上述错误是因为你想尝试切换到基于[x+1]的标签索引,它看起来像这样:

browser.window_handles[1]
browser.window_handles[2]
browser.window_handles[3]
etc...

而您最多只能有 2 个窗口。

单击每个k 元素后,您只需使用.window_handles[1] 切换到第二个选项卡,并在循环之前初始化源窗口,它看起来会更简单:

origin_win = browser.current_window_handle
for k in list1:
    k.click()
    time.sleep(2)
    browser.switch_to.window(browser.window_handles[1])
    browser.close()
    browser.switch_to.window(origin_win)

【讨论】:

    【解决方案2】:

    收集所有窗口句柄并切换到新的句柄以对其执行操作更容易。请参阅下面的解决方案,

    window_current = browser.current_window_handle
    print(window_current)
    
    for k in list1:
        time.sleep(2.5)
        k.click()
        time.sleep(2)
        x=list1.index(k)
        print(x)
        handles = browser.window_handles
        print(len(handles))
        for handle in handles:
            if handle != window_current:
                browser.switch_to.window(handle) 
    
        print(browser.current_window_handle)
        browser.close()
        browser.switch_to.window(window_current)
    

    【讨论】:

      【解决方案3】:
      window_after = browser.window_handles[1]
      

      而不是

      window_after = browser.window_handles[x+1]
      

      因为browser.close() 会关闭最后一个标签,所以browser.window_handles 的长度可以是2 或1。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 2020-11-13
        • 1970-01-01
        • 2017-12-10
        相关资源
        最近更新 更多