как можно уменьшить скорость ввода символов селен питон - PullRequest
0 голосов
/ 02 мая 2018

Мой автоматический тест выдает слово «MyApplication», оно делает это очень быстро, мне нужно набрать слово за 0,5–0,7 секунды. Я знаю, что могу использовать time.sleep, но я хотел бы узнать другое решение, как я могу сделать это по-другому? Я не хочу time.sleep, потому что запрос к серверу идет всего 300 мс и не может быть изменен. Быстрый ввод приводит к тому, что тест не работает.

да, это автоматический тест. Надпись для ввода, введенная методом отправки ключей.

WebDriverWait(driver, 10).until(
    EC.element_to_be_clikable((By.XPATH, "myypath"))
)
driver.find_element(By.XPATH, "myypath").send_keys("MyApplication")

1 Ответ

0 голосов
/ 02 мая 2018

Либо введите задержку, которая будет соответствовать минимально допустимому времени, которое страница может обработать:

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...