【问题标题】:Python Selenium how to use an existing chromedriver window?Python Selenium 如何使用现有的 chromedriver 窗口?
【发布时间】:2019-01-11 18:41:01
【问题描述】:

我正在制作一个自动化的 python 脚本,它会循环打开 chromedriver,直到它在网页上找到驱动程序获取的特定元素(使用 selenium)。这显然最终会消耗资源,因为它在循环中不断地打开和关闭驱动程序。

有没有办法使用现有的 chromedriver 窗口,而不是仅仅打开和关闭循环,直到满足条件?

如果这不可能,您会推荐其他方法吗?

谢谢!

脚本:

from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import pyautogui
import time
import os

def snkrs():
    driver = webdriver.Chrome('/Users/me/Desktop/Random/chromedriver')
    driver.get('https://www.nike.com/launch/?s=in-stock')
    time.sleep(3)
    pyautogui.click(184,451)
    pyautogui.click(184,451)
    current = driver.current_url
    driver.get(current)
    time.sleep(3.5)
    elem = driver.find_element_by_xpath("//* . 
    [@id='j_s17368440']/div[2]/aside/div[1]/h1")
    ihtml = elem.get_attribute('innerHTML')

    if ihtml == 'MOON RACER':
        os.system("clear")
        print("SNKR has not dropped")
        time.sleep(1)
    else:
        print("SNKR has dropped")
        pyautogui.click(1303,380)
        pyautogui.hotkey('command', 't')
        pyautogui.typewrite('python3 messages.py') # Notifies me by text
        pyautogui.press('return')
        pyautogui.click(928,248)
        pyautogui.hotkey('ctrl', 'z') # Kills the bash loop

snkrs()

Bash 循环文件:

#!/bin/bash

while [ 1 ]
do
   python snkrs.py
done

【问题讨论】:

  • 这里的意图是不断地重新加载网页,直到出现某些内容然后终止循环?
  • 是的,这就是目的

标签: python selenium automation selenium-chromedriver


【解决方案1】:

您正在定义一个包含 chromedriver 启动的方法,然后通过该方法运行一次(不是循环),因此每个方法调用都会生成一个新的浏览器实例。与其这样做,不如做一些类似这样的事情......

url = 'https://www.nike.com/launch/?s=in-stock'
driver.get(url)

# toggle grid view
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[aria-label='Show Products as List']"))).click();

# wait for shoes to drop
while not driver.find_elements((By.XPATH, "//div[@class='figcaption-content']//h3[contains(.,'MOON RACER')]"))
    print("SNKR has not dropped")
    time.sleep(300) // 300s = 5 mins, don't spam their site
    driver.get(url)

print("SNKR has dropped")

我简化了您的代码,更改了定位器,并添加了一个循环。该脚本启动浏览器(一次),加载站点,单击网格视图切换按钮,然后查找要在此列表中显示的所需鞋子。如果鞋子不存在,它只会休眠 5 分钟,重新加载页面,然后重试。无需每 1 秒刷新一次页面。你会引起对自己的关注,而且鞋子不会经常在网站上更新。

【讨论】:

  • 感谢您的回复,我目前收到以下错误。我明天可能可以解决,但是如果修复对您来说很容易,请LMK!错误:selenium.common.exceptions.WebDriverException:消息:无效参数:“使用”必须是字符串
  • @bapwsta 在哪一行?
  • 第 16 行(我在脚本中添加了一些行):“虽然不是 driver.find_elements((By.XPATH, "//div[@class='figcaption-content']//h3[包含(.,'MOON RACER')]")):
  • 我得到了它的工作,再次感谢您的回复,我期待在未来使用我从您的版本中获得的知识。这不再是一项黑客工作了哈哈
  • 接受并点赞,我的点赞尚未公开显示。
【解决方案2】:

如果您只是想等到页面上的某些内容发生变化,那么这应该可以解决问题:

snkr_has_not_dropped = True

while snkr_has_not_dropped:

    elem = driver.find_element_by_xpath("//* .[ @ id = 'j_s17368440'] / div[2] / aside / div[1] / h1")
    ihtml = elem.get_attribute('innerHTML')

    if ihtml == 'MOON RACER':
        print("SNKR has not dropped")
        driver.refresh()
    else:
        print("SNKR has dropped")
        snkr_has_not_dropped = False

只需要刷新页面再试一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2021-10-04
    • 2023-03-28
    相关资源
    最近更新 更多