按下热键时不会关闭 Selenium Webdriver 会话 (python)

hotkey does not close Seleinum Webdriver session when pressed (python)

在python编程方面我几乎是一个胎儿,我希望你们中的一些大神能够帮助我。基本上我有一个循环设置,从网站上提取值,但我需要它 运行 无限期,直到我按下指定的热键 q,循环 运行s 并提取所需的数据,但每当我按 q,循环只是保持 运行ning,我必须手动关闭浏览器。

这里是有问题的代码片段:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By
import time
import keyboard

PATH = r"C:\Users\username"
options = Options()
options.binary_location = r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
ser = Service(executable_path=ChromeDriverManager().install())
cweb = webdriver.Chrome(service=ser, options=options)

class Coin:
    def __init__(self, coinname, datasource):
         self.coinname = coinname
         self.datasource = datasource
    
    def pulldata(self):
         self.values = []
         time.sleep(5)
         cweb.get(self.datasource)
         time.sleep(5)
         
         price = cweb.find_element(By.XPATH, '//*[@id="__next"]/div[1]/div[1]/div[2]/div/div[1]/div[2]/div/div[2]/div[1]/div/span')
         percent = cweb.find_element(By.XPATH, '//*[@id="__next"]/div[1]/div[1]/div[2]/div/div[1]/div[2]/div/div[2]/div[1]/span')
         upordown = cweb.find_element(By.XPATH, '//*[@id="__next"]/div[1]/div[1]/div[2]/div/div[1]/div[2]/div/div[2]/div[1]/span/span')
         caret = upordown.get_attribute('class')
    
         if caret == 'icon-Caret-up':
             daychange = ('' + percent.text)

         elif caret == 'icon-Caret-down':
             daychange2 = ('-' + percent.text)

         vol = cweb.find_element(By.XPATH, '//*[@id="__next"]/div[1]/div[1]/div[2]/div/div[1]/div[2]/div/div[3]/div[1]/div[3]/div[1]/div[2]/div')
         mkcap = cweb.find_element(By.XPATH, '//*[@id="__next"]/div[1]/div[1]/div[2]/div/div[1]/div[2]/div/div[3]/div[1]/div[1]/div/div[2]/div')
         circsupply = cweb.find_element(By.XPATH, '//*[@id="__next"]/div[1]/div[1]/div[2]/div/div[1]/div[2]/div/div[3]/div[1]/div[4]/div[2]/div[1]')
         self.values.append(price.text) 
       
         if caret == 'icon-Caret-up':
               self.values.append(daychange)
         elif caret == 'icon-Caret-down':
               self.values.append(daychange2)

         self.values.append(vol.text)
         self.values.append(mkcap.text)
         self.values.append(circsupply.text)
         print(self.values)

def kill_chromedriver():   
  for proc in psutil.process_iter():
       if proc.name() == "chromedriver.exe":
            proc.kill()
       if proc.name() == "chrome.exe":
            proc.kill()
 
         
while True:
   btc = Coin('Bitcoin','https://coinmarketcap.com/currencies/bitcoin/')
   btc.pulldata()
   btc2 = Coin('Bitcoin','https://coinmarketcap.com/currencies/tether/')
   btc2.pulldata()

   if keyboard.is_pressed('q'):
        kill_chromedriver()
        break

  

打印('done reading')

那么我该如何编辑这段代码,以便驱动程序关闭并且循环根据命令停止? 我试过将 break 语句放在不同的地方,并将 cweb.close() 函数放在循环之外。我会继续运行宁通过其他选项。如果有任何提示或帮助,我将不胜感激。

编辑:从一个非常有用的小伙子那里得到了一些帮助,但似乎按下热键被计算机和 python 识别,但 selenium 或浏览器会话本身却无法识别。 希望我能像 yall do lmao

那样了解更多代码

G-man

我发现使用 selenium 时 .quit() 有时会失败。您可以改用 psutil。在 if keyboard.is_pressed('q'): 块中调用此函数。

import psutil

def kill_chromedriver():   
    for proc in psutil.process_iter():
        if proc.name() == "chromedriver.exe":
            proc.kill()

编辑:我认为您的问题可能与 read_key() 在提取数据之前不执行有关。我在 Jupyter 中的 cpu 上测试了这个并且它有效。

while True:
    btc = Coin('Bitcoin','https://coinmarketcap.com/currencies/bitcoin/')
    btc.pulldata()
    btc2 = Coin('Bitcoin','https://coinmarketcap.com/currencies/tether/')
    btc2.pulldata()

    print("You can press q now.")
    if keyboard.read_key() == "q":
       
        kill_chromedriver()
        break