python-3.x selenium抛出错误,如果firefox的示例已经打开

tf7tbtn2  于 12个月前  发布在  Python
关注(0)|答案(3)|浏览(125)

我用下面的代码搜索谷歌和点击第一个搜索结果。

from selenium import webdriver
import urllib.parse
import time
from selenium.webdriver.firefox.options import Options

options = Options()
options.set_preference("dom.popup_maximum", 100)
options.add_argument("-profile")
options.add_argument("/home/blueray/.mozilla/firefox/5ertyoox.default-release")
options.page_load_strategy = 'eager'
# options.add_extension('fhnegjjodccfaliddboelcleikbmapik.crx')
browser = webdriver.Firefox(options=options)

with open("google-search-terms.adoc") as fin:
    for line_no, line in enumerate(fin):
        line = line.strip()
        query = urllib.parse.urlencode({'q': line + " site:amazon.com"})
        browser.execute_script(f"window.open('https://www.google.com/search?{query}');")

time.sleep(5)

for x in range(1, len(browser.window_handles)):
    browser.switch_to.window(browser.window_handles[x])
    try:

        elm = browser.find_elements_by_xpath(
            '/html/body/div[7]/div/div[9]/div[1]/div/div[2]/div[2]/div/div/div[1]/div/div/div[1]/a/h3')

        if not elm:
            elm = browser.find_elements_by_xpath(
                '/html/body/div[7]/div/div[9]/div[1]/div/div[2]/div[2]/div/div/div[1]/div/div/div/div[1]/a/h3')

        elm[0].click()

    except Exception as e:
        print("Error", str(e))

然而,如果一个firefox示例打开,我运行脚本,它会给出这样的消息:
Firefox已在运行,但没有响应。要使用Firefox,您必须先关闭现有Firefox进程,重新启动设备或使用其他配置文件。
程序终止,并出现以下错误:

Traceback (most recent call last):
  File "google-search-amazon-less-captcha.py", line 13, in <module>
    browser = webdriver.Firefox(options=options)
  File "/home/blueray/.local/lib/python3.8/site-packages/selenium/webdriver/firefox/webdriver.py", line 170, in __init__
    RemoteWebDriver.__init__(
  File "/home/blueray/.local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/home/blueray/.local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/home/blueray/.local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/blueray/.local/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Process unexpectedly closed with status 0

我应该怎么做才不会有错误,即使一个firefox的示例已经打开?

gzjq41n4

gzjq41n41#

我也遇到了同样的问题,但前提是打开的firefox示例与我在脚本中加载的配置文件相同。如果您从该脚本中删除配置文件,它应该会运行。如果您的代码使用的配置文件与当前打开的窗口使用的配置文件不同,它也应该起作用。
你也可以使用不推荐的selenium 3加载配置文件的方式,这对我来说避免了错误。

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile

ffOptions = Options()
ffProfile = FirefoxProfile(r'C:\Users\Tyler\AppData\Roaming\Mozilla\Firefox\Profiles\0753x1pz.default')
ffOptions.profile = ffProfile

driver = webdriver.Firefox(options=ffOptions)
driver.get("http://www.google.com")

我仍然在寻找一个可行的解决方案,使用 selenium 4的方式设置配置文件。

nx7onnlm

nx7onnlm2#

有时,Selenium脚本会让Web驱动程序打开,而不是正确关闭它们。
一个好的实践是一个好的try/except/finally块:

driver = webdriver.Firefox()
try:
    # Your code
except Exception as e:
    # Log or print error
finally:
    driver.close()
    driver.quit()

此外,你应该尝试杀死任何在你的系统上运行的firefox进程,作为python脚本的一部分,使用类似这样的东西:

.....
.....
import os
os.system("taskkill /im geckodriver.exe /f")
os.system("taskkill /im firefox.exe /f")
s4chpxco

s4chpxco3#

options = Options()    
options.profile = r"C:\Users\XXX\AppData\Roaming\Mozilla\Firefox\Profiles\XXX.XXX"
driver = webdriver.Firefox(service = s, options=options)

这是一个非常烦人的问题,但出于某种原因-我发现上面的代码工作。我从以下网站获得:https://github.com/SeleniumHQ/selenium/issues/11028

相关问题