selenium.common.exceptions.InvalidArgumentException:消息:使用 Selenium Python 从文本文件读取的 URL 调用 get() 时参数无

Posted

技术标签:

【中文标题】selenium.common.exceptions.InvalidArgumentException:消息:使用 Selenium Python 从文本文件读取的 URL 调用 get() 时参数无效错误【英文标题】:selenium.common.exceptions.InvalidArgumentException: Message: invalid argument error invoking get() with urls read from text file with Selenium Python 【发布时间】:2020-05-02 11:13:34 【问题描述】:

我有一个 .txt 文件中的 URL 列表,我想使用 selenium 运行。

假设文件名为 b.txt,其中包含 2 个 url(格式如下): https://www.google.com/,https://www.bing.com/,

我想要做的是让 selenium 运行两个 url(来自 .txt 文件),但是似乎每次代码到达“driver.get”行时,代码都会失败。

url = open ('b.txt','r')
url_rpt = url.read().split(",")
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=options)
for link in url_rpt:
   driver.get(link)
driver.quit()

我运行代码时得到的结果是

Traceback (most recent call last):
File "C:/Users/ASUS/PycharmProjects/XXXX/Test.py", line 22, in <module>
driver.get(link)
File "C:\Users\ASUS\AppData\Local\Programs\Python\Python38\lib\site- 
packages\selenium\webdriver\remote\webdriver.py", line 333, in get
self.execute(Command.GET, 'url': url)
File "C:\Users\ASUS\AppData\Local\Programs\Python\Python38\lib\site- 
packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Users\ASUS\AppData\Local\Programs\Python\Python38\lib\site- 
packages\selenium\webdriver\remote\errorhandler.py", line 242, in 
check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidArgumentException: Message: invalid 
argument
(Session info: headless chrome=79.0.3945.117)

对如何重写代码有什么建议吗?

【问题讨论】:

“失败”是什么意思?你有例外吗?如果是这样,消息和堆栈跟踪是什么?我们需要这些基本信息。 driver.get(link)上方的for循环中添加一行print(link) 当“代码失败”是什么意思?错误信息是什么?如果你只运行for url in url_rpt: print(url) 会发生什么。这可能不是 Selenium 的问题,但可能是 url 输入和阅读策略。这将有助于缩小 Selenium 是否真的引发错误,或者问题是否与文件有关。 我会在帖子上更新这个。 @Christine:谢谢!如果我运行 for url in url_rpt: print (ur) 它会返回两个链接就好了。 【参考方案1】:

我也遇到了类似的问题,Selenium 在打开 URL 时出错并打印以下消息:

selenium.common.exceptions.InvalidArgumentException: Message: invalid argument
  (Session info: MicrosoftEdge=91.0.852.0)

仔细观察,我发现我的 url 字符串是 'UTF-8' 并包含一个前导 ZWNBSP 字符,因此 selenium 无法接受 URL(我正在从文件中读取 url 列表,它造成这种情况)。 IMO,selenium 应该更好地报告错误(说 URL 参数无效)。

为了纠正这个问题,我使用下面的代码来清理我的 URL:

url = url.encode('ascii', 'ignore').decode('unicode_escape')

【讨论】:

仅供参考,如果我们只是打印要检查的 URL,这些额外的字符(例如 ZWNBSP )可能不可见。【参考方案2】:

此错误消息...

Traceback (most recent call last):
  .
    driver.get(link)
  .
    self.execute(Command.GET, 'url': url)
  .
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument
  (Session info: chrome=79.0.3945.117)

...暗示作为参数传递给get()url 是无效的参数。

当包含 url 列表的 text 文件在最后一个网址。可能有一个 空格字符 出现在 b.txt 的 fag 末尾,为 https://www.google.com/,https://www.bing.com/,


调试

理想的调试方法是打印url_rpt,它会显示空格字符,如下所示:

代码块:

url = open ('url_list.txt','r')
url_rpt = url.read().split(",")
print(url_rpt)

控制台输出:

['https://www.google.com/', 'https://www.bing.com/', ' ']

解决方案

如果您从末尾删除 空格字符,您自己的代码将完美执行:

options = webdriver.ChromeOptions() 
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
url = open ('url_list.txt','r')
url_rpt = url.read().split(",")
print(url_rpt)
for link in url_rpt:
   driver.get(link)
driver.quit()

【讨论】:

发现列表末尾有逗号!非常感谢您强调这一点! 当我忘记用https://启动网址时遇到了同样的错误 与@philomath 相同,我在 driver.get() 函数上遇到了该异常,我通过使用 http:// 作为前缀解决了它(在我的情况下为 http://localhost) 我在函数内使用多行字符串添加一个列表,在其上调用 .splitlines() ,并将缩进计算为具有四个空格的新数组元素。谢谢!

以上是关于selenium.common.exceptions.InvalidArgumentException:消息:使用 Selenium Python 从文本文件读取的 URL 调用 get() 时参数无的主要内容,如果未能解决你的问题,请参考以下文章