【问题标题】:Python Selenium Geckodriver should be in PATHPython Selenium Geckodriver 应该在 PATH 中
【发布时间】:2020-12-18 01:12:54
【问题描述】:

我正在尝试使用 Selenium 自动填写表格。这是 HTML 代码:

<!DOCTYPE html>
<html>
<body>

<h2>Text input fields</h2>

<form>
  <label for="fname">First name:</label><br>
  <input type="text" id="fname" name="fname" value="John"><br>
  <label for="lname">Last name:</label><br>
  <input type="text" id="lname" name="lname" value="Doe"><br>
    <label for="cars">Choose a car:</label>
  <select id="cars" name="cars">
    <option value="volvo">Volvo</option>
    <option value="saab">Saab</option>
    <option value="fiat">Fiat</option>
    <option value="audi">Audi</option>
  </select><br>
  <textarea name="message" rows="10" cols="30">The cat was playing in the garden.</textarea>
</form>

这里是 Python/Selenium 代码:​​它说 Geckodriver 需要在 PATH 中。以前当我收到此错误时,我指定了可执行路径,但这似乎不再起作用。我做错了什么?

import selenium
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox(executable_path="C:\Users\Anna\Downloads\geckodriver")
driver.get("example form.html")

#First name
element = driver.find_element_by_name("fname")
element.clear()

element.send_keys("Anna")

#Last name
element = driver.find_element_by_name("lname")
element.clear()

element.send_keys("Zharavina")

#Dropdown list | Car selection
select = Select(driver.find_element_by_name("cars"))
select.deselect_all()
select.select_by_value(volvo)

#Textarea
element = driver.find_element_by_name("message")
element.clear()

element.send_keys("Test message 10013341381")

这是我得到的错误:

Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/selenium/webdriver/common/service.py", line 72, in start
    self.process = subprocess.Popen(cmd, env=self.env,
  File "/usr/lib/python3.8/subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/lib/python3.8/subprocess.py", line 1702, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'geckodriver.exe'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 7, in <module>
    driver = webdriver.Firefox(executable_path="geckodriver.exe")
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/selenium/webdriver/firefox/webdriver.py", line 164, in __init__
    self.service.start()
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/selenium/webdriver/common/service.py", line 81, in start
    raise WebDriverException(
selenium.common.exceptions.WebDriverException: Message: 'geckodriver.exe' executable needs to be in PATH.

我做错了什么?

【问题讨论】:

    标签: python html selenium web automation


    【解决方案1】:

    尝试在executable_path 中将\ 替换为/
    替换这个:

    driver = webdriver.Firefox(executable_path="C:\Users\Anna\Downloads\geckodriver")
    

    与:

    driver = webdriver.Firefox(executable_path="C:/Users/Anna/Downloads/geckodriver")
    

    或者您可以将 geckodriver 移动到您保存源代码的同一目录中。则无需提供可执行路径。

    driver = webdriver.Firefox() #will also work fine
    

    【讨论】:

    • 您好,感谢您的快速回答。我尝试了这两件事,但我仍然得到同样的错误。
    【解决方案2】:

    您当前的代码存在两个问题;更简单的一种 - 将路径传递给驱动程序的方式。
    在 Python 字符串中,字符 \ 称为转义字符,用于指定特殊字符(如 \n 用于换行)。

    所以如果你需要实际使用它——比如在路径中——你需要逃避它自己;此外,Windows 中的可执行文件通常带有扩展名“.exe”,您已将其省略。因此,该调用中的正确论点是:

    driver = webdriver.Firefox(executable_path="C:\\Users\\Anna\\Downloads\\geckodriver.exe")
    

    你也可以使用 Python 的 raw strings,而不是转义 \ 字符:

    driver = webdriver.Firefox(executable_path=r"C:\Users\Anna\Downloads\geckodriver.exe")
    

    driver.get("example form.html")


    现在有一个更大的问题,哪个解决方案完全在您手中 - 通过异常堆栈跟踪,很明显您正在某些 Linux 操作系统环境中运行脚本。同时,您尝试传递的 geckodriver 位于 Windows 驱动器中,并且是这样的可执行文件。
    您必须更改两者之一 - 在 Windows 中运行它,或者将路径传递给 Linux geckodriver 可执行文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 2017-05-17
      • 2018-07-11
      • 1970-01-01
      相关资源
      最近更新 更多