selenium.common.exceptions.InvalidArgumentException: Сообщение: ошибка недопустимого аргумента при вызове get() с URL-адресами, прочитанными из текстового файла с помощью Selenium Python

#java #selenium #webdriver #selenium-chromedriver #bufferedreader

#python #Список #selenium #for-цикл #selenium-webdriver

Вопрос:

У меня есть список 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:UsersASUSAppDataLocalProgramsPythonPython38libsite- 
packagesseleniumwebdriverremotewebdriver.py", line 333, in get
self.execute(Command.GET, {'url': url})
File "C:UsersASUSAppDataLocalProgramsPythonPython38libsite- 
packagesseleniumwebdriverremotewebdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:UsersASUSAppDataLocalProgramsPythonPython38libsite- 
packagesseleniumwebdriverremoteerrorhandler.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)
 

Есть предложения о том, как переписать код?

Комментарии:

1. Что вы подразумеваете под «сбой?» Вы получаете исключение? Если да, то что это за сообщение и трассировка стека? Нам нужна эта базовая информация.

2. В цикле for выше driver.get(link) добавьте строку print(link) .

3. Когда «сбой кода», что вы имеете в виду? Что это за сообщение об ошибке? Что произойдет, если вы просто запустите for url in url_rpt: print(url) . Это может быть проблемой не с Selenium, а, возможно, со url стратегией ввода и чтения. Это помогло бы сузить, действительно ли Selenium выдает ошибку или проблема связана с файлом.

4. Я обновлю это в сообщении.

5. @Christine: Спасибо! Если бы я запустил runa for url in url_rpt: print (ur) , он вернул бы обе ссылки просто отлично.

Ответ №1:

Это сообщение об ошибке…

 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)
 

…подразумевает, что url переданный в качестве аргумента get() аргумент был недействительным.

Я смог воспроизвести ту же обратную трассировку, когда текстовый файл, содержащий список URL-адресов, содержит пробел после разделителя последнего URL-адреса. Возможно, символ пробела присутствовал в конце fag b.txt как 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:WebDriverschromedriver.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()
 

Комментарии:

1. Понял, что в конце списка есть запятая! Большое спасибо за выделение этого!!

2. Я столкнулся с той же ошибкой, когда забыл начать URL с https://

3. То же, что и @philomath, я получал это исключение в функции driver.get(), и я решил его, используя http:// в качестве префикса ( http:// localhost в моем случае)

4. Я добавлял список, используя многострочную строку внутри функции, вызывая для нее .splitlines() , и он считал отступ как новый элемент массива с четырьмя пробелами. Спасибо!

Ответ №2:

Я также столкнулся с аналогичной проблемой, когда при открытии URL-адреса произошла ошибка Selenium и было напечатано сообщение ниже:

 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')
 

Комментарии:

1. К вашему сведению, эти дополнительные символы (например, ZWNBSP ) могут быть не видны, если мы просто напечатаем URL-адреса для проверки.