我正在尝试使用Python中的硒查询chatbot,以输入查询,然后运行jQuery以获取响应。
假设,它的运行效果很好,聊天机器人的网页加载速度足够快。 如果出于某种原因网页响应缓慢,那么我的脚本会查询响应,然后显示为空白或获取先前的响应。
我如何解决这个问题而不求助于严重的睡眠延迟?目前,该页面最多可能需要5-7秒的时间(两次回复之间),也可能只需要1-2秒。
有没有一种方法可以指示程序在运行jQuery之前等待服务器的响应?
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options
import re
from requests import get
class AIBot:
def __init__(self):
# Initialize selenium options
self.opts = Options()
self.opts.add_argument("-headless")
self.browser = webdriver.Firefox(options=self.opts)
self.url = "http://demo.vhost.pandorabots.com/pandora/talk?botid=b0dafd24ee35a477"
def get_form(self):
# Find the form tag to enter your message
self.browser.implicitly_wait(10.0)
self.elem = self.browser.find_element_by_name('input')
def send_input(self, userInput):
# Submits your message
fOne = '<\/?[a-z]+>|<DOCTYPE'
fTwo = '/<[^>]+>/g'
while True:
try:
self.elem.send_keys(userInput + Keys.RETURN)
except BrokenPipeError:
continue
break
def get_response(self):
# Retrieves response message
jFetch = get("http://code.jquery.com/jquery-1.11.3.min.js").content.decode('utf8')
self.browser.execute_script(jFetch)
response = self.browser.execute_script("""
var main_str = $('font:has(b:contains("Chomsky:"))').contents().has( "br" ).last().text().trim();
main_str = main_str.replace(/Chomsky:/gi,'').replace(/Wikipedia is a great online encyclopedia./gi,
'Wikipedia is your friend. Use it.').replace(/^\\s*[\\r\\n]/gm, '');
return main_str;
""")
return response
def mainLoop():
# Reset variables and connect to AI bot
humanString = None
robotString = None
pb = AIBot()
pb.browser.get(pb.url)
while True:
# User input
humanString = input("Human says: ")
pb.get_form()
if humanString == 'exit':
break
# Bot response
pb.send_input(humanString)
robotString = pb.get_response()
print("Robot says: " + robotString)
pb.browser.close()
if __name__ == '__main__':
mainLoop()
请澄清一下,在此特定情况下,等到元素找到为止并没有帮助,因为此网页只是没有任何有用的元素作为目标,尤其是在漫游器的响应区域中。
也许有一种方法可以检查jQuery运行时响应变量是否与以前相同,并一直等到它发生变化?