【问题标题】:Selenium WebDriverWait keeps throwing a TimeoutExceptionSelenium WebDriverWait 不断抛出 TimeoutException
【发布时间】:2020-10-06 16:19:30
【问题描述】:

我使用 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>

感谢任何解决此问题的指导。

【问题讨论】:

    标签: selenium selenium-webdriver iframe webdriverwait timeoutexception


    【解决方案1】:

    电子邮件不是框架。您使用的条件用于框架( iframe 标签),但在这里您正在处理输入标签。因此,我建议您根据您的要求检查该元素的可见性或该元素的存在。

    【讨论】:

    • 谢谢。我尝试了以下操作,但仍然收到“超时异常消息”错误:WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.XPATH,"//div[@id='email']"))) .send_keys("mymail@gmail.com")
    【解决方案2】:

    您需要注意几件事。

    如果元素在 / 内,如果没有相关的 HTML,则很难构建规范的答案。但是,根据您分享的HTML,我看不到任何&lt;frame&gt; / &lt;iframe&gt; 的存在。


    通常,要在元素中发送字符序列,您需要将WebDriverWait 用于element_to_be_clickable(),您可以使用以下任一Locator Strategies:

    • 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")
      

    您可以在How to click on a element through Selenium Python找到相关讨论


    如果元素在 a 内,您必须:

    • 诱导 WebDriverWait 使所需的框架可用并切换到它。
    • 诱导 WebDriverWait 使所需的元素可点击。
    • 您可以使用以下任一Locator Strategies:

      • 使用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
        

        您可以在Unable to type within username field within ProtonMail signup page using Selenium and Python找到相关讨论


    参考

    您可以在以下位置找到一些相关讨论:

    【讨论】:

    • 谢谢! CSS_SELECTOR 起作用了。登录是在一个弹出窗口中,所以我也必须添加这个:driver.switch_to.window(driver.window_handles[0])
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多