【问题标题】:In Selenium (Python) - how to click a button _only after_ a file is uploaded?在 Selenium (Python) 中 - 如何仅在上传文件后单击按钮?
【发布时间】:2014-05-08 22:50:22
【问题描述】:

使用 Selenium,我在点击提交按钮时遇到问题只有在上传文件后

在下面的演示代码中 - 只有在 g 元素中文件完成上传后,才应点击 submit 元素。

但是,我似乎无法正确使用wait.until 来实现上述目的。
即,即使文件似乎已完全上传(超时为 30 秒,文件只有 56kB) - 我得到以下 超时异常:

sh-4.1$ ./stackoverflow_selenium_example.py 
Traceback (most recent call last):
  File "./stackoverflow_selenium_example.py", line 51, in <module>
    main()
  File "./stackoverflow_selenium_example.py", line 42, in main
    elem = wait.until(EC.text_to_be_present_in_element_value((By.ID,'g'),fax["document"]))
  File "/usr/lib/python2.7/site-packages/selenium/webdriver/support/wait.py", line 71, in until
    raise TimeoutException(message)
selenium.common.exceptions.TimeoutException: Message: '' 
sh-4.1$

注意事项:

1. submit 元素为:&lt;input type="submit" id="sub" name="submit" value="שלחו פקס"&gt;
2. g元素为:&lt;input class="fileUpload0" id="g" data-file='' data-func='upload' type="file" name="files[]" style=""&gt;

Python 代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

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

AWHILE = 30
SHORT_TIME = 10

def main():
        url = "http://www.freefax.co.il"
        email = "a.b@c.com"

        fax = {}
        fax["document"] = r"C:\tmp\DevOpsTest.pdf"
        fax["description"] = "Example of selenium problem"
        fax["numbers"] = r"04-000-0001"

        driver = webdriver.Chrome()
        wait = WebDriverWait(driver, AWHILE)

        driver.get(url + os.sep + "upload.php")
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        elem = driver.find_element_by_name("Desc")
        elem.send_keys(fax["description"])
        elem = driver.find_element_by_id("NumberList0")
        elem.send_keys(fax["numbers"])
        elem = driver.find_element_by_name("email")
        elem.send_keys(email)
        elem = driver.find_element_by_name("Yes")
        elem.click()

        driver.execute_script("window.scrollTo(0, 0);")
        elem = driver.find_element_by_id("g")
        elem.send_keys(fax["document"])
        elem = wait.until(EC.text_to_be_present_in_element_value((By.ID,'g'),fax["document"]))
        elem = wait.until(EC.element_to_be_clickable((By.NAME,'submit')))
        elem.click()

        # Show next screen for a short time.
        time.sleep(SHORT_TIME)
        driver.quit() # end the whole session.

if __name__ == "__main__":
    main()

异常时的屏幕截图

环境:

硒:硒(2.37.2) 铬:版本 33.0.1750.154 m Cygein:CYGWIN_NT-6.1-WOW64 1.7.28(0.271/5/3) i686 Windows 7旗舰版

【问题讨论】:

    标签: python exception selenium selenium-webdriver timeout


    【解决方案1】:

    我只是在学习 Selenium。

    在输入文本时,您通过 ID 定位元素,但对于检查点,您使用的是 NAME。你不应该在检查点中也使用 ID 吗?

    【讨论】:

    • 我认为这是“任何其他名字的玫瑰”的一个例子——但可能更 Pythonic 我应该在我的引用方式上保持一致。谢谢。
    • 你的意思是元素的ID和NAME属性相同吗?该错误清楚地表明硒在尝试查找元素时超时。我在这里没有看到任何其他问题。
    • Mae culpa:确实我使用的是 By.NAME 而不是 By.ID。但是,即使在修正了这个错字之后,我仍然得到: Traceback(最近一次调用最后一次):文件“./stackoverflow_selenium_example.py”,第 51 行,在 main() 文件“./stackoverflow_selenium_example.py”中,第 42 行,在 main elem = wait.until(EC.text_to_be_present_in_element_value((By.ID,'g'),fax["document"])) 文件“/usr/lib/python2.7/site-packages/selenium/ webdriver/support/wait.py",第 71 行,直到 raise TimeoutException(message) selenium.common.exceptions.TimeoutException: Message: ''
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    相关资源
    最近更新 更多