在Selenium(Python)中 - 如何在文件上传后再点击按钮?

1 投票
1 回答
2664 浏览
提问于 2025-04-18 00:25

我在使用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元素是:<input type="submit" id="sub" name="submit" value="שלחו פקס">
2. g元素是:<input class="fileUpload0" id="g" data-file='' data-func='upload' type="file" name="files[]" style="">

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()

异常发生时的屏幕截图

屏幕截图

环境:

    Selenium: selenium (2.37.2)
    Chrome: Version 33.0.1750.154 m
    Cygein: CYGWIN_NT-6.1-WOW64 1.7.28(0.271/5/3) i686 
    Windows: 7 Ultimate

1 个回答

0

我刚开始学习Selenium。

在输入文本时,你是通过ID来找到元素的,但在检查点的时候却用的是NAME。难道在检查点也不应该用ID吗?

撰写回答