Я работал над скриптом онлайн-проверки статуса для OkCupid. Итак, что произойдет, если человек, которого я отслеживаю, ведет журнал OkCupid, сценарий обнаружит его на основе <div class = "userinfo2015-basics-username-online-icon isOnline"></div>, который отображается после входа в систему. Он зацикливается каждую минуту, чтобы увидеть, есть ли какие-либо изменения статуса. По большей части работает хорошо, может продолжаться 30-40 минут, но потом вылетает.
Результат скрипта выглядит так:
----------------------------------------------
[i] Status | Last Checked | Update |
----------------------------------------------
[-] Offline 08-14 18:33:03 60 Sec |
[+] Online 08-14 18:34:05 60 Sec |
[+] Online 08-14 18:35:09 60 Sec |
[+] Online 08-14 18:36:10 60 Sec |
----------------------------------------------
Это цикл:
try:
while 1:
status = driver.find_elements_by_tag_name('div')[41].get_attribute('class') # Span Class for Online status
driver.refresh()
time_online = datetime.now().strftime('%m-%d %H:%M:%S')
time.sleep(5)
if status == str('userinfo2015-basics-username-online-icon isOnline'):
print('[+] Online'+7*' '+time_online+5*' '+str(update+5)+' Sec |')
elif status != str('userinfo2015-basics-username-online-icon isOnline'):
print(bc.red+'[-] Offline'+6*' '+time_online+5*' '+str(update+5)+' Sec |')
time.sleep(update)
except KeyboardInterrupt:
print(' Exiting\n'+46*'-')
driver.quit()
Тогда ошибка:
Traceback (most recent call last):
File "okCupid_online_status.py", line 38, in <module>
status = driver.find_elements_by_tag_name('div')[41].get_attribute('class') # Span Class for Online status
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 539, in find_elements_by_tag_name
return self.find_elements(by=By.TAG_NAME, value=name)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 985, in find_elements
'value': value})['value'] or []
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 314, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: timeout
(Session info: chrome=67.0.3396.99)
(Driver info: chromedriver=2.39.562737 (dba483cee6a5f15e2e2d73df16968ab10b38a2bf),platform=Linux 4.15.0-29-generic x86_64)
Поэтому мне больше интересно, могу ли я вызвать исключение и обойти ошибку, если это произойдет, и получить свой сценарий для продолжения цикла?






Трудно сказать наверняка, но по моему опыту, исключение тайм-аута в Selenium часто возникает, когда страница браузера не отвечает. В следующий раз, когда это произойдет, я предлагаю вам проверить, так ли это.
Если это действительно так, то, поскольку вы создаете парсер (в отличие от автоматизации тестирования), вы должны перехватить исключение и повторить попытку. Если бы вы писали автоматизацию тестирования, я бы сказал, что вы должны сообщить об ошибке, потому что неотвечающая страница обычно является ошибкой в коде JavaScript страницы.
Можете ли вы поймать это исключение и позволить циклу снова запуститься? Также иногда вы можете выйти из драйвера и снова открыть его через некоторое время