【问题标题】:Creation of PhantomJS webdriver causes user input problems in Python over ssh session创建 PhantomJS webdriver 在 Python 中通过 ssh 会话导致用户输入问题
【发布时间】:2016-05-21 13:43:02
【问题描述】:

当我远程运行 Python 程序并尝试使用 PhantomJS 网络驱动程序时,大多数时候用户对我的 Python 程序的输入没有响应。一切都执行得很好,就像我在本地运行它时一样,除了大多数按键没有在 raw_input() 的提示下注册。我必须(平均)按 3 次键才能真正显示在控制台中。

这是 only 在我的程序中创建 PhantomJS 实例后的 raw_input 上的。我通过设置w = None 挑出了这个问题,其中w 是webdriver。完成此操作后,用户输入在整个程序中继续正常工作。

我可以启动另一个 ssh 会话并且标准输入工作正常。我还可以启动我的程序的另一个实例 (python run.py),在该实例创建 webdriver 之前,raw_input 在其中也可以正常工作。我尝试在另一个 ssh 会话中运行 top,但我的服务器上根本没有负载。所以只有对父 python 进程的输入受到影响。

我认为最好的情况是,有人可以帮助我找到问题的根源。我没有工具来缩小造成这种情况的范围。谢谢!



可能相关的其他信息

ps -aux 在 ssh 会话中为我提供了这些相关过程:

[TTY: pts/1, STAT: S+] python run.py
[TTY: pts/1, STAT: S1+] node /usr/local/bin/phantomjs --webdriver=52129
[TTY: pts/1, STAT: S1+] /usr/local/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs --webdriver=52129

所有这些都使用可忽略不计的内存和 CPU

Selenium webdriver 创建是自定义的-(总结)customdriver.py:

def mkDriver(params):
    # params aren't relevant because this is the setup I always use on the server
    w = webdriver.PhantomJS({'phantomjs.page.settings.loadImages': 'false'})
    loginToFacebook(w)
    loginToTwitter(w)
    # for later- w.quit() leaves phantom process running
    w.phantomjsPID = collectPhantomjsPID()

...虽然我不认为问题与那里的任何其他语句有关,但此函数完成执行并且我的程序继续。

一些注意事项:

  • 笔记本电脑:OS X El Capitan,2.4GHz 英特尔酷睿 i5,8GB 内存

  • 服务器:Ubuntu Server 14.04,2.0GHz intel xeon e5,8GB 内存 - 我使用的是我自己设置的 micro .ec2,但有人为我设置了这个,让我可以使用更强大的东西。它在 IBM Softlayer 上运行。

  • 1234563 -tty 在 ssh 上打开和关闭(不要认为这适用于我运行程序的方式),并尝试在 python 中使用 -u 标志。
  • 当我在服务器上运行我的程序时,最初所有 raw_input() 语句都给出了 EOFError。我使用我发现的this solution“修复”了这个问题,即使用 raw_input 在所有模块中导入 readline。不知道它为什么起作用。我知道 raw_input() 来自 sys.stdin.readline...

  • 如果您正在查看下面的伪代码,其目的是更改 ui 及其调用的函数,然后继续测试,而无需在 resources 中重新生成任何内容(大多数重要的是 webdriver,它需要很长时间才能加载)。该结构还可以轻松进行一些预先编写的测试。

模块概述...

运行.py:

params = raw_input('enter parameters')

w = customdriver.mkDriver(params)
t = tweepy_connection()
f = facebook_Graph_API_conection()
s = sqlAlchemy_engine()
resources = [w, t, f, s]

while True:
    choice = raw_input('1: break, 2: restart ui')
    if choice == '1':
        break
    elif choice == '2':
        reload(ui.py)
        ui.ui_function(resources)
    else:
        continue

ui.py:

def ui_function(resources):
    while True:
        choice = raw_input('1: break, 2: functionA, 3: functionB')
        if choice == '1':
            break
        elif choice == '2':
            reload(file1)
            params = raw_input('enter parameters')
            file1.functionA(resources, params)
        elif choice == '3':
            reload(file2)
            params = raw_input('enter some other parameters')
            file2.functionB(resources, params)
     else:
         continue

【问题讨论】:

    标签: python linux selenium-webdriver ssh phantomjs


    【解决方案1】:

    当您只创建一个 PhantomJS 实例时,原始输入是否会挂起,或者您是否使用它进行任何无头浏览?如果您正在浏览,那么 raw_inputs 挂起是有道理的,因为每个网站请求都会因此停止 shell。

    你考虑过多线程吗?

    【讨论】:

    • 您能详细说明一下吗?唯一的浏览(在出现问题之前)是登录到 twitter 和 facebook,之后它会无限期地停止,尽管 webdriver 只是闲置。不,我从来没有考虑过多线程,在本地运行时我从来不需要,这似乎有点过分了。
    • PJS 在完成请求之前不会释放它的资源(这也是 raw_input 资源),更不用说它有内存泄漏的历史。如果您不喜欢多线程,您可能需要考虑使用 webdrivers 等待命令,以使您的程序更易于管理。
    • 还想补充一点,webdrivers javascript 处理(例如 w.execute_script("document.querySelector('.button').click()") )让您立即获得 shell 控制权。在某些情况下可能比w.click()
    • 是的,我知道execute_script 可能会有所帮助......但我经常使用等待命令,wait_until_element_clickable 等,以确保事情只在可能时发生,我不明白如何这将帮助我重新获得 shell 控制权。我的 mac 上的 shell 在资源方面不应该与 ssh 上的 linux shell 没有什么不同吗?
    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多