被困在Python的Selenium chromedriver中执行无限的javascript循环

时间:2019-01-06 22:29:48

标签: python python-3.x selenium selenium-webdriver selenium-chromedriver

我正在尝试构建一种服务,用户可以在其中插入其Javascript代码,并在特定网站上执行该代码。我使用python的selenium lib和chromedriver中的webdriver。问题是,如果用户使用无限循环提交Javascript代码,则python脚本会卡住。

python脚本需要处理许多任务,例如:进入网站并执行一些Javascript代码。因此,我承受不了它的卡住。众所周知,JavaScript中的无限循环会导致浏览器冻结。但是,是否有某种方法可以设置Webdriver的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 :(得分:1)

您可以为driver.execute_script("while (1);")通话设置超时。 我发现another post可以解决此问题。

基本上,如果您使用的是Unix系统,则可以使用signaldriver.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()