我正在寻求帮助以硒运行循环。我想打开一个主页,然后在单击链接时打开一个窗口,然后切换到新窗口,然后关闭新窗口以切换回主页。我的目标是多次执行此操作,但是当我运行代码时,它可以工作一次(对于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])
答案 0 :(得分:0)
window_after = browser.window_handles[1]
代替
window_after = browser.window_handles[x+1]
因为browser.close()
将关闭最后一个标签,所以browser.window_handles
的长度可以是2或1。
答案 1 :(得分:0)
更容易收集所有窗口句柄并切换到新的窗口句柄以对其执行操作。请参阅下面的解决方案,
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)
答案 2 :(得分:0)
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)