浏览器.关闭()用一个环来开启一股新风

2024-04-26 18:06:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找帮助来运行selenium循环。我想打开一个主页,然后在单击链接时打开一个窗口,然后切换到新窗口,然后关闭新窗口切换回主页。我的目标是多次执行此操作,但当我运行代码时,它只运行一次(对于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])

Tags: 代码fromimportdivbrowsersupporttimeselenium
3条回答
window_after = browser.window_handles[1]

而不是

window_after = browser.window_handles[x+1]

因为browser.close()将关闭最后一个选项卡,所以browser.window_handles的长度可以是2或1。你知道吗

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

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)

IndexError: list index out of range

出现上述错误是因为您希望尝试切换到基于[x+1]的选项卡索引,它将如下所示:

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

但是你最多只能有两个窗口。你知道吗

单击每个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)

相关问题 更多 >