Либо введите задержку, которая будет соответствовать минимально допустимому времени, которое страница может обработать:
from selenium import webdriver
import time
def send_delayed_keys(element, text, delay=0.3) :
for c in text :
endtime = time.time() + delay
element.send_keys(c)
time.sleep(endtime - time.time())
driver = webdriver.Chrome()
driver.get("https://www.google.com/search")
element = driver.find_element_by_css_selector('[name="q"]')
send_delayed_keys(element, "abcdef", 0.6)
Или отправьте каждый ключ и дождитесь ожидающего запроса:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time
def send_autocomplete_keys(element, text) :
ajax = AjaxWaiter(element.parent)
for c in text :
element.send_keys(c)
ajax.wait_idle()
driver = webdriver.Chrome()
driver.get("https://www.google.com/search")
element = driver.find_element_by_css_selector('[name="q"]')
send_autocomplete_keys(element, "abcdef")
class AjaxWaiter(object):
JS_IS_XHR_IDLE = """\
if (!('active' in XMLHttpRequest))(function (){
var _send = XMLHttpRequest.prototype.send;
function _onrelease(){ --XMLHttpRequest.active };
function _onloadend(){ setTimeout(_onrelease, 1) };
XMLHttpRequest.active = 0;
XMLHttpRequest.prototype.send = function send() {
++XMLHttpRequest.active;
this.addEventListener('loadend', _onloadend, true);
_send.apply(this, arguments);
};
})();
return XMLHttpRequest.active == 0;
"""
def __init__(self, driver, timeout=10, frequency=0.08) :
self.driver = driver
self.waiter = WebDriverWait(self, timeout, frequency)
self.driver.execute_script(self.JS_IS_XHR_IDLE)
def is_idle(self) :
return self.driver.execute_script(self.JS_IS_XHR_IDLE)
def wait_idle(self) :
self.waiter.until(AjaxWaiter.is_idle, "Pending requests")