Selenium с Python Random Timeout без сообщения об ошибке - PullRequest
0 голосов
/ 20 марта 2020

Я следую примеру здесь (на вкладке Python): https://www.selenium.dev/documentation/en/

Код здесь:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support.expected_conditions import presence_of_element_located

    #This example requires Selenium WebDriver 3.13 or newer
    with webdriver.Firefox() as driver:
        wait = WebDriverWait(driver, 10)
        driver.get("https://google.com/ncr")
        driver.find_element_by_name("q").send_keys("cheese" + Keys.RETURN)
        first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>div")))
        print(first_result.get_attribute("textContent"))

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

    Traceback (most recent call last):
    File "c:\Users\User\PyCharm_Projects\Project\sample_test.py", line 12, in <module>
        first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>div")))
    File "C:\Program Files\Python38\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
        raise TimeoutException(message, screen, stacktrace)
    selenium.common.exceptions.TimeoutException: Message:

Мой вопрос: что вызывает ошибку тайм-аута, если она не происходит каждый раз? Я пытался найти элементы с другими методами (XPATH, текст ссылки). Я рассмотрел другие следующие примеры, но ничего из того, что они публикуют, похоже, не решало эту проблему:

Пробовал, не работало - Исключения случайного тайм-аута Selenium без сообщений

Неприменимые решения - Панель поиска в Instagram с селеном - Ошибка определения времени селена - Случайное исключение времени ожидания даже после использования ui.WebDriverWait () chrome селен python

Я нахожусь на Python 3.8, Firefox 68.6.0, и вот соответствующие пакеты от 'pip freeze' - beautifulsoup4 == 4.8.2 - запросы == 2.22.0 - селен == 3.141.0 - urllib3 == 1.25.8 - webencodings == 0.5.1

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Я сделал несколько индивидуальных действий для этих случаев, например:

def findXpath(xpath,driver):
    actionDone = False
    count = 0
    while not actionDone:
        if count == 3:
            raise Exception("Cannot found element %s after retrying 3 times.\n"%xpath)
            break
        try:
            element = WebDriverWait(driver, waitTime).until(
                    EC.presence_of_element_located((By.XPATH, xpath)))
            actionDone = True
        except:
            count += 1
    sleep(random.randint(1,5)*0.1)
    return element 
0 голосов
/ 20 марта 2020

Пожалуйста, обратитесь к приведенному ниже решению, я выполнил это в браузере chrome и firefox пару раз, и он работает нормально. Исключение TimeoutException, если команда не завершается в достаточное время.

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium import webdriver

#utilise chrome driver to open specified webpage
driver = webdriver.Chrome(executable_path=r"chromedriver.exe")
driver.maximize_window()
driver.get("https://google.com/ncr")
WebDriverWait(driver, 20).until(
EC.visibility_of_element_located((By.NAME,"q"))).send_keys("cheese" + Keys.RETURN)


first_result=WebDriverWait(driver, 20).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, "h3>div")))

print(first_result.get_attribute("textContent"))

Вывод

Показать ещё

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...