gpt4 book ai didi

python - Selenium 中的简单文件上传片段适用于 Chrome,但不适用于我的 Mac 上的 Firefox

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:24 25 4
gpt4 key购买 nike

this answer 提供我有一点 Selenium 在工作:

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 : 元素当前不可见,因此可能无法与之交互。我的猜测是该错误与 Selenium 处理操作系统文件上传选择器对话框所执行的魔法有关。我认为这可能也是为什么我尝试等到元素变得可见的尝试不起作用的原因:“魔法”不涉及元素变得可见。这是我尝试过的:

# https://stackoverflow.com/a/15142611/2829764, found via https://stackoverflow.com/q/6101461/2829764
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
...
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "sbi_file_upload")))

我使用的是 Firefox 36.0.1、Selenium 2.45.0 和 Python 2.7.9。顺便说一句,当我将 Firefox 更新到 36.0.1 时,Selenium 已停止与 Firefox 一起工作,但我今天更新了我的 Selenium,我遇到的特殊问题就消失了。

最佳答案

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

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

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

>>> from selenium import webdriver
>>> driver = webdriver.Firefox()
>>> 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.is_displayed()
False

以下是实际导致我们看到的行为的相关问题:


这里的解决方案是使输入可见,以便我们可以将 key 发送给它。我发现了一种使输入可见的相当奇怪的方法 - 它涉及首先发送一个空文件值,返回并通过 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

现在您可以将 key 发送到文件输入 - 经过测试,适合我。

关于python - Selenium 中的简单文件上传片段适用于 Chrome,但不适用于我的 Mac 上的 Firefox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28919499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com