Python Selenium: несовместимое время загрузки веб-страниц с нажатиями кнопок? - PullRequest
0 голосов
/ 07 апреля 2019

Я использую селен, чтобы создать покупателя на сайте, чтобы проверить свои навыки в Python. Мне удалось заставить большую часть этого работать, за исключением некоторых несоответствий во времени загрузки страницы, которые я не могу исправить, но я думаю, что я знаю, почему это происходит.

Когда я загружаю страницу товара в магазине, я использую следующий код:

  try:
        cartbttn = driver.find_element_by_name('commit')
        if cartbttn.is_displayed():
            driver.execute_script("document.getElementsByName('commit')[0].click()")
            print("Added to cart")
    except(StaleElementReferenceException):
        return(115)

Код обычно работает нормально, и скрипт завершает свою работу в среднем за 2,5 секунды. Проблема в том, что иногда нажатие кнопки «Добавить корзину» или «Оформить заказ» приводит к задержке страницы и заставляет страницу «останавливаться» на несколько секунд, как будто она обрабатывается, а затем действие завершается. Я знаю, что это не задержка с их стороны, так как сайт не занят, и когда я делаю это вручную, нажимая кнопки, проблема никогда не возникает.

Я полагаю, что должно произойти то, что javascript нажатия кнопки выполняется, когда кнопка полностью «видима» и щелкает, но иногда нажатие кнопки вызывается перед этим и вызывает сбои в работе сайта и требует этого времени наверстывания.

Я пытался дождаться, пока элемент будет виден, и использовать функцию element.click (), которая не дает эффекта. Я думал, что использование JavaScript для вызова нажатия кнопки будет работать, но это тоже не сработало.

Я также добавил ручные сны, которые помогли. Единственная проблема со сном заключается в том, что они должны быть достаточно большими для наихудших сценариев, что означает, что вы теряете преимущество в скорости, если сайт работает быстрее.

Ожидаемый результат - нажатие кнопки и ожидание появления кнопки «Оформить заказ», прежде чем пытаться нажать кнопку «Оформить заказ», чтобы не возникало проблем с сайтом.

1 Ответ

0 голосов
/ 08 апреля 2019

Поскольку вы хотите вызвать click() для элемента вместо использования is_displayed() или в ожидании элемента, видимого , вам нужно вызвать WebDriverWait для желаемого элемент должен быть кликабелен , и вы можете использовать следующее решение:

try:
    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.NAME, "commit"))).click()
    print("Added to cart")
except(TimeoutException):
    return("Error while adding to cart")

Примечание : необходимо добавить следующий импорт:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...