Chrome浏览器中简单的Selenium文件上传片段正常工作,但在Firefox浏览器上不起作用。

2024-06-01 01:47:25 发布

您现在位置:Python中文网/ 问答频道 /正文

承蒙this answer的帮助,我得到了一些硒元素:

import contextlib
from selenium import webdriver

with contextlib.closing(webdriver.Chrome()) as driver:
    driver.get("http://www.bing.com/images")
    driver.find_element_by_id("sbi_t").click()
    element = driver.find_element_by_id("sbi_file_upload")
    element.send_keys("//Loch Ness Monster.jpg")

但是,当我从webdriver.Chrome()切换到webdriver.Firefox()时,我开始得到selenium.common.exceptions.ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with。我的猜测是,这个错误与Selenium处理操作系统文件上载选择器对话框的魔力有关。我认为这可能也是我试图等到元素变得可见的原因所在:“魔力”并不涉及元素变得可见。我试了一下:

^{pr2}$

我使用的是firefox36.0.1、Selenium 2.45.0和python2.7.9。顺便说一句,当我把Firefox更新到36.0.1时,Selenium已经停止与Firefox一起工作了,但是我今天更新了我的Selenium,而且这个问题已经消失了。在


Tags: importid元素bydriverseleniumwithelement
3条回答

解决方案“使元素在firefox中可见” 对我来说很棒

driver.execute_script('arguments[0].style = ""; 
arguments[0].style.display = "block"; 
arguments[0].style.visibility = "visible";', file_input)

对@alexce的回答稍作修改。这是我唯一能在我的机器上持续工作的东西。在

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

driver = webdriver.Firefox()
driver.get('http://www.bing.com/images')

WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "sbi_t")))
driver.find_element_by_id("sbi_t").click()

try:
    WebDriverWait(driver, 1).until(EC.visibility_of_element_located((By.ID, "sbi_file_upload")))
    raise Exception("This never seems to happen")
except selenium.common.exceptions.TimeoutException:
    pass

button = driver.find_element_by_id('sbi_gh')
driver.execute_script('arguments[0].style.display = "block";', button)
button.click()  # submitting the form, empty file
driver.back()

WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "sbi_t")))
driver.find_element_by_id("sbi_t").click()
file_input = driver.find_element_by_id('sbi_file_upload')
driver.execute_script('arguments[0].style = ""; arguments[0].style.display = "block"; arguments[0].style.visibility = "visible";', file_input)
file_input.send_keys("//Loch Ness Monster.jpg")

要向其发送键的元素的不透明度值设置为0

<input id="sbi_file_upload" name="imageBinary" type="file" accept="image/*" style="opacity: 0;">

并且Firefox(正确地)认为元素是不可见的:

^{pr2}$

以下是一些相关问题,它们实际上是我们所看到的行为的原因:


这里的解决方案是使input可见,这样我们就可以向它发送密钥了。我发现了一种使输入可见的非常奇怪的方法——它首先发送一个空文件值,然后返回并通过execute_script()使input可见。希望,您不需要额外的back()步骤就可以工作了:

>>> driver = webdriver.Firefox()
>>> driver.get('http://www.bing.com/images')
>>> driver.maximize_window()
>>> 
>>> driver.find_element_by_id("sbi_t").click()
>>> 
>>> button = driver.find_element_by_id('sbi_gh')
>>> driver.execute_script('arguments[0].style.display = "block";', button)
>>> button.click()  # submitting the form, empty file
>>> 
>>> driver.back()
>>> driver.find_element_by_id("sbi_t").click()
>>> 
>>> file_input = driver.find_element_by_id('sbi_file_upload')
>>> file_input.is_displayed()
False
>>> 
>>> driver.execute_script('arguments[0].style = ""; arguments[0].style.display = "block"; arguments[0].style.visibility = "visible";', file_input)
>>> 
>>> file_input.is_displayed()
True

现在你可以发送密钥到文件输入测试,对我有用。在

相关问题 更多 >