Застревание при выполнении бесконечного цикла javascript в хромодрайвере Python Selenium - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь создать службу, где пользователи могут вставлять свой код Javascript, и он выполняется на определенном веб-сайте. Я использую webdriver из библиотеки python для селена lib и chromedriver. Проблема в том, что скрипт python застревает, если пользователь отправляет код Javascript с бесконечным циклом.

Сценарий python должен обрабатывать множество задач, таких как: перейти на веб-сайт и выполнить некоторый код Javascript. Так что я не могу позволить себе застрять. Известно, что бесконечный цикл в Javascript вызывает зависание браузера. Но разве нет способа установить тайм-аут для метода execute_script веб-драйвера? Я хотел бы вернуться к Python после истечения времени ожидания и продолжить выполнение кода после команды execute_script. Это возможно?

from selenium import webdriver
chromedriver = "C:\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(chromedriver)
driver.get("http://www.bulletproofpasswords.org/") # Or any other website
driver.execute_script("while (1); // Javascript infinite loop causing freeze")

1 Ответ

0 голосов
/ 07 января 2019

Вы можете установить тайм-аут для вашего driver.execute_script("while (1);") вызова. Я нашел другой пост , который может решить эту проблему.

По сути, если вы работаете в системе Unix, вы можете использовать сигнал , чтобы установить тайм-аут для вашего driver.execute_script("while (1); вызова.

Или, если вы можете запустить его в отдельном процессе, а затем завершить процесс, если это займет слишком много времени, используя multiprocessing.Process. Я включаю пример, который был приведен в другом посте:

import multiprocessing
import time

# bar
def bar():
    for i in range(100):
        print "Tick"
        time.sleep(1)

if __name__ == '__main__':
    # Start bar as a process
    p = multiprocessing.Process(target=bar)
    p.start()

    # Wait for 10 seconds or until process finishes
    p.join(10)

    # If thread is still active
    if p.is_alive():
        print "running... let's kill it..."

        # Terminate
        p.terminate()
        p.join()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...