Python Selenium如何使用现有的chromedriver窗口?

时间:2018-08-03 20:48:49

标签: python selenium automation selenium-chromedriver

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

有没有一种方法可以使用现有的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

2 个答案:

答案 0 :(得分:0)

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

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

只需刷新页面,然后重试。

答案 1 :(得分:0)

您正在定义一个包含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秒刷新一次页面。您将引起自己的注意,并且鞋子也不会经常在网站上更新。