Selenium 中的简单文件上传片段在 Chrome 中有效,但在我的 Mac 中不适用于 Firefox
Simple file upload snippet in Selenium works in Chrome but not Firefox on my Mac
感谢 我已经得到了一些 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: Element is not currently visible and so may not be interacted with
。我的猜测是该错误与 Selenium 处理操作系统文件上传选择器对话框所执行的魔法有关。我认为这可能也是我尝试等待元素变得可见的原因不起作用的原因:"magic" 不涉及元素变得可见。这是我尝试过的:
# found via
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,我遇到的特殊问题就消失了。
您要向其发送密钥的元素的不透明度值设置为 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
以下是实际导致我们看到的行为的相关问题:
- Selenium allows to sendKeys into an invisible input type=file
- With Firefox can not upload file to hidden field
这里的解决方案是 使 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
现在您可以将密钥发送到文件输入 - 经过测试,适合我。
@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")
解决方案'make the element visible in firefox '
对我来说很棒
driver.execute_script('arguments[0].style = "";
arguments[0].style.display = "block";
arguments[0].style.visibility = "visible";', file_input)
试试这个,如果 is_displayed()
方法出现异常
from selenium import webdriver
def is_Displayed(class_name):
ele=driver.execute_script("return document.getElementsByClassName('"+class_name+"')[0].style.visibility = 'visible';")
if ele=="visible":
return True
else:
return False
def test_check_element():
global driver
driver=webdriver.Safari()//e.g Firefox() , Chrome()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get("url")
submitBtn=driver.find_element_by_xpath("//button[@title='Submit']").get_attribute("class")
if is_Displayed(submitBtn)== True:
print "Displayed "
else:
print "Not Displayed"
感谢
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 处理操作系统文件上传选择器对话框所执行的魔法有关。我认为这可能也是我尝试等待元素变得可见的原因不起作用的原因:"magic" 不涉及元素变得可见。这是我尝试过的:
# found via
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,我遇到的特殊问题就消失了。
您要向其发送密钥的元素的不透明度值设置为 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
以下是实际导致我们看到的行为的相关问题:
- Selenium allows to sendKeys into an invisible input type=file
- With Firefox can not upload file to hidden field
这里的解决方案是 使 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
现在您可以将密钥发送到文件输入 - 经过测试,适合我。
@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")
解决方案'make the element visible in firefox ' 对我来说很棒
driver.execute_script('arguments[0].style = "";
arguments[0].style.display = "block";
arguments[0].style.visibility = "visible";', file_input)
试试这个,如果 is_displayed()
方法出现异常
from selenium import webdriver
def is_Displayed(class_name):
ele=driver.execute_script("return document.getElementsByClassName('"+class_name+"')[0].style.visibility = 'visible';")
if ele=="visible":
return True
else:
return False
def test_check_element():
global driver
driver=webdriver.Safari()//e.g Firefox() , Chrome()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get("url")
submitBtn=driver.find_element_by_xpath("//button[@title='Submit']").get_attribute("class")
if is_Displayed(submitBtn)== True:
print "Displayed "
else:
print "Not Displayed"