繁体   English   中英

Selenium中的简单文件上传代码段可在Chrome上运行,但在Mac上无法运行Firefox

[英]Simple file upload snippet in Selenium works in Chrome but not Firefox on my Mac

有了这个答案,我使硒工作了:

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与操作系统文件上传选择器对话框配合使用时产生的魔力有关。 我想这也可能就是为什么我试图等到元素变得可见为止没有起作用的原因:“魔术”并不涉及元素变得可见。 这是我尝试过的:

# 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,而我遇到的特定问题就消失了。

您要发送键的元素的不透明度值设置为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

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


这里的解决方案是使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")

解决方案“使元素在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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM