Selenium WebDriverWait продолжает генерировать исключение TimeoutException - PullRequest
0 голосов
/ 17 июня 2020

Я использую Selenium для входа в систему следующим образом:

driver.switch_to.default_content()
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,'email'))).send_keys("myemail@gmail.com")

, но я продолжаю получать сообщение об ошибке:

TimeoutException: Message:

Я также пробовал:

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='email']"))).send_keys("myemail@gmail.com")

Вот исходный HTML код, к которому я обращаюсь:

<div id="signup-form">
    <div class="logo"></div>
    <h1 data-i18n="signin">Sign in</h1>
    <div class="panels-wrapper">
        <div class="panels">
            <div class="panel step-1">
                <input name="email" type="text" id="email" required="" maxlength="100">
                <label for="email" data-i18n="email">Email</label>

Оцените любые рекомендации по исправлению этого.

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Есть несколько вещей, о которых вам нужно позаботиться.

Если элемент находится внутри / , без соответствующего HTML было бы сложно построить канонический ответ. Однако, согласно HTML, которыми вы поделились, я не вижу присутствия каких-либо <frame> / <iframe>.


Как правило, для отправки последовательность символов в элементе необходимо использовать WebDriverWait для element_to_be_clickable(), и вы можете использовать любую из следующих Стратегий локатора :

  • CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#email[name='email']"))).send_keys("myemail@gmail.com")
    
  • XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='email' and @name='email']"))).send_keys("myemail@gmail.com")
    

Вы можете найти соответствующее обсуждение в Как щелкнуть элемент через Selenium Python


Если элемент находится внутри, вы должны:

  • Вызвать WebDriverWait , чтобы желаемый фрейм был доступен, и переключиться на него .
  • Вызвать WebDriverWait для нужного элемента , чтобы быть интерактивным .
  • Вы можете использовать любую из следующих Стратегий локатора :

    • Используя CSS_SELECTOR:

      driver.get('site_url')
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe_cssSelector")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#email[name='email']"))).send_keys("myemail@gmail.com")
      
    • Использование XPATH:

      driver.get('site_url')
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"iframe_xpath")))
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='email' and @name='email']"))).send_keys("myemail@gmail.com")
      
    • Примечание : вам необходимо добавить следующий импорт:

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

      Соответствующее обсуждение можно найти в Невозможно ввести имя пользователя на странице регистрации ProtonMail с использованием Selenium и Python


Ссылка

Вы можете найти пару соответствующих обсуждений в:

1 голос
/ 17 июня 2020

Электронная почта не фрейм. Используемое вами условие используется для фрейма (тег iframe), но здесь вы имеете дело с тегом ввода. Поэтому я предлагаю вам проверить либо видимость этого элемента, либо наличие этого элемента в зависимости от ваших требований.

...