在Selenium中获取文件选择器对话框的ID或其他句柄

时间:2019-01-13 17:48:59

标签: python selenium selenium-webdriver

SO上有很多关于如何使用Selenium中的文件选择器的文章,但他们似乎都认为您已经引用了代表文件选择器对话框的元素,通常是因为您知道该元素的ID。您如何找到这个?我的常规方法无法使用“检查元素”,因为无法通过文件选择器对话框打开“检查元素”。

有问题的页面是images.bing.com。当您单击相机(“使用图像搜索”),然后单击浏览时,将显示文件选择器。

这就是我尝试过的。我编写了此函数,以获取所有可见元素的列表,以便在单击链接以显示文件选择器之后,便可以查看哪些元素可见(但之前没有看到)。此过程标识了三个这样的元素,但是当我运行elem.get_attribute("id")elem.get_property("id")时,它们都不具有ID。

def get_visible_elements(self):
    result = set()
    for elem in self.driver.find_elements_by_css_selector("*"):
        try:
            if elem.is_displayed():
                result.add(elem)
        except StaleElementReferenceException:
            pass
    return result

3 个答案:

答案 0 :(得分:1)

按照in this Selenium tutorial给出的步骤上传文件,您不是在寻找对话框元素本身,而是在寻找生成它的foreach (var item in mergedSet) { Console.WriteLine($"{item.NewSet},{item.OldSet}"); } HTML元素。

为此,通常可以检查显示文件选择对话框的按钮。如果没有,请检查附近的东西并查看附近的HTML。

在这种情况下,对于images.bing.com,我检查了显示<input type="file">的按钮,并在附近找到了应该起作用的元素:

"Drag an image here or browse"

答案 1 :(得分:0)

文件选择器是 OS native 控件。因此,将无法与文件选择器对话框框进行交互,即使通过检查元素也无法找到它。

仅当元素是<input>标签并且 type 属性设置为file时,对表示文件选择器对话框的元素的引用才有效:

<input type="file" name="myFile" accept="image/jpeg, image/png">

解决方案

要与 OS native “文件选择器”对话框框进行交互,您需要寻找基于AutoIt的解决方案。

答案 2 :(得分:0)

这是一些基于@mblakesley的答案的代码。在调用ElementNotInteractableException时,我不得不使用Javascript使相关元素可见,以避免出现send_keys

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

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

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

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

fileinput = driver.find_element_by_id('sb_fileinput')
driver.execute_script(
    'arguments[0].style = ""; arguments[0].style.display = "block"; arguments[0].style.visibility = "visible";',
    fileinput)
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "sb_fileinput")))
fileinput.send_keys("/sample.jpg")