在Selenium(Python)中 - 如何在文件上传后再点击按钮?
我在使用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吗?