【问题标题】:Selenium window_handles does not work for javascript buttonSelenium window_handles 不适用于 javascript 按钮
【发布时间】:2020-01-27 15:46:55
【问题描述】:

我正在做一个硒项目。我需要单击 javascript 按钮并将我的新 url 保存在 selenium window_handles 中。我的代码如下

window_before = driver.window_handles[0]
driver.find_element_by_xpath("//*[@id]/div/div[3]/div/button").click()
window_after = driver.window_handles[1]

但我收到以下错误:

window_after = driver.window_handles[1]
IndexError: list index out of range

【问题讨论】:

  • 我认为如果您转到下一页,句柄不会改变。我说的对吗?
  • @M3hdi 是的,对
  • 那么它是打开一个新的水龙头还是新的窗口?
  • 尝试在.click()之后添加一些睡眠秒数
  • @Mahdi :奇怪的是,当我点击查看配置文件时它没有打开新窗口,它导航到同一个窗口并且 url 没有改变。可能是位置问题或其他我不知道的问题不知道。

标签: python selenium webdriverwait window-handles expected-condition


【解决方案1】:

它基本上是在同一个窗口而不是新窗口上加载数据。但是在搜索每个页面数据后,你会找到 5 个要查看的个人资料,我已经为你做了第一页的公司详细信息。这是代码。

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 import webdriver
import time
driver = webdriver.Chrome()

driver.get('https://locatr.cloudapps.cisco.com/WWChannels/LOCATR/openBasicSearch.do;jsessionid=8CDF9284D014CFF911CB8E6F81812619')
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='searchLocationInput']"))).send_keys('China')
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//li[@class='ng-scope']//span[text()='CHINA']"))).click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,"searchBtn"))).click()
buttons=WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,"button[action-type='viewProfileButton']")))

for i in range(len(buttons)):
    buttons = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "button[action-type='viewProfileButton']")))
    driver.execute_script("arguments[0].click();",buttons[i])

    item=WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"div.partnerAddressAlign"))).text
    print(item)
    time.sleep(2)
    WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"a[action-type='clickBackToResult']"))).click()
    print("=======================================")

控制台输出:

5A, TOWER A, PACIFIC CENTURY PLACE, 2A GONG TI BEI LU, CHAOYANG DISTRICT, BEIJING
BEIJING, BEIJING 100027 CHINA
8032 Kms away 
Gold Global Gold Master Specialized
Visit Partner Website
Show Additional Locations
=======================================
UNIT 1808, 18TH FLOOR CHINA WORLD TOWER 2
NO, 1 JIAN GUO MEN WAI AVENUE
BEIJING, BEIJING 100738 CHINA
8034 Kms away 
Gold Global Gold
Visit Partner Website | Call
Show Additional Locations
=======================================
702 TOWER W3 ORIENTAL PLAZA
BEIJING, BEIJING 100738 CHINA
8032 Kms away 
Gold Global Gold
Call
Show Additional Locations
=======================================
Dimension Data House
Building 2,Waterfront Business Park
Fleet Road
Fleet, HAMPSHIRE GU51 3QT UNITED KINGDOM
282 Kms away 
Gold Global Gold Master Specialized Customer Experience Specialized
Visit Partner Website | Call
Show Additional Locations
=======================================
110 BUCKINGHAM AVENUE
SLOUGH, BERKSHIRE SL1 4PF UNITED KINGDOM
259 Kms away 
Gold Global Gold Customer Experience Specialized
Visit Partner Website | Call
Show Additional Locations
=======================================

【讨论】:

    【解决方案2】:

    从您的代码试验来看,您并不清楚为什么您期望多个 window_handles 并且您已经使用过:

    window_before = driver.window_handles[0]
    

    假设您有一个活动的window_handle 并继续前进,您需要调用click(),它会创建另一个window_handle,以收集您需要用@ 诱导WebDriverWait 的所有window_handles 987654321@ 为number_of_windows_to_be(2),您可以使用以下解决方案:

    • 代码块:

      windows_before  = driver.current_window_handle
      driver.find_element_by_xpath("//*[@id]/div/div[3]/div/button").click()
      WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
      windows_after = driver.window_handles
      

    您可以在Open web in new tab Selenium + Python找到详细讨论

    【讨论】:

    • 我正在处理的网页是:locatr.cloudapps.cisco.com/WWChannels/LOCATR/… 问题是当我在每个合作伙伴部分搜索合作伙伴并按查看个人资料时,会显示新窗口但我无法按顺序存储其地址返回主搜索结果页面。
    • @Mahdi 您可以随时回来,但这应该是一个单独的问题。
    • 不,这是我从一开始就在寻找的东西
    • @Mahdi 您的问题与错误IndexError: list index out of range 有关,但是您有机会看到参考讨论吗?
    • 是的,我看到了那个链接,但是他们正在使用我这里没有的真实 url,我可以通过 xpath 导航到新窗口。
    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 2018-07-22
    • 2018-03-10
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 2020-08-26
    相关资源
    最近更新 更多