代码之家  ›  专栏  ›  技术社区  ›  Knockoutpie

使用带有Selenium和SeleniumBase的Python在UPS网站上弹出退出Cookie

  •  0
  • Knockoutpie  · 技术社区  · 2 年前

    这是我正在使用的代码,我现在传递了一个假的跟踪号码,我关闭了聊天窗口,然后试图关闭cookie窗口。但由于某种原因,我无法点击X按钮,任何帮助都将不胜感激。

    除了最后一行以外,这里的一切都正常。。如果安装了正确的软件包,您应该能够将其复制/粘贴到.py文件中并进行自己的测试。

    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.chrome.options import Options
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.common.exceptions import NoSuchElementException
    import time
    import os
    import pandas as pd
    import pyautogui
    import undetected_chromedriver as uc
    from seleniumbase import Driver
    from selenium.webdriver.common.action_chains import ActionChains
    
    # Add the driver options
    driver = Driver(uc=True)
    
    with driver:
        # Go to the target website
        driver.get("https://google.com")
        driver.maximize_window()
    #driver.set_window_size(1920, 820)
    time.sleep(2)
    
    driver.get("https://www.ups.com/track?track=yes&trackNums=1Z12345E1512345676&loc=en_US&requester=ST/")
    time.sleep(3)
    # Create another loop to run based on which element is found.
    
    # Find UPS Element
    U_Ele = driver.find_element(By.XPATH, "//span[contains(text(), 'UPS')]")
    print(f"UPS Element found")
    
    #Switch to UPS iframe
    iframe = driver.find_element(By.XPATH, "//iframe[@id='inqChatStage']")
    driver.switch_to.frame(iframe)
    WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="top-bar"]/div/div[1]/div[1]/topbar-element/div/div/div/div'))).click()
    time.sleep(2)
    driver.find_element(By.XPATH, '//button[@class="close_btn"]').click()
    

    enter image description here

    1 回复  |  直到 2 年前
        1
  •  1
  •   JeffC    2 年前

    问题是,您将上下文切换到IFRAME,但从未从该上下文返回。Selenium正在IFRAME中寻找cookie面板关闭按钮。要将上下文返回到整页,您需要使用 driver.switch_to.default_content() .


    其他建议:

    1. 避免 time.sleep() 。它们会使你的脚本变慢,而且不像 WebDriverWait .
    2. 使用 WebDriverWait 一贯地您应该对每个元素交互使用等待/ .find_element() 呼叫如果要单击元素,请使用 EC.element_to_be_clickable() 。如果您要以其他方式与元素交互(获取 .text ,等等,使用 EC.visibility_of_element_located() 回顾 the docs 了解更多等待类型和其他信息。
    3. 你导航了两次。。。首先是谷歌,然后是UPS网站。您只需要导航一次。
    4. 保持进口清洁。您导入了两个不同的实例 WebDriverWait 以及一堆你没有使用的其他进口产品。在编码时,将导入列表缩减为仅必要的内容可以减少代码和混乱。
    5. 你应该更喜欢 By.ID() By.CSS_SELECTOR() 到XPaths。ID是页面上最简单、最不可能更改的。CSS选择器比XPaths更快,语法更简单。

    考虑到所有这些,我将您的代码简化为下面的工作代码,

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    
    url = 'https://www.ups.com/track?track=yes&trackNums=1Z12345E1512345676&loc=en_US&requester=ST/'
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get(url)
    
    wait = WebDriverWait(driver, 5)
    
    # switch to chat IFRAME and close chat
    wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, "inqChatStage")))
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[aria-label='End Chat']"))).click()
    driver.switch_to.default_content()
    
    # close cookies panel
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.implicit_consent span.ups-icon-x"))).click()
    
    driver.quit()