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
答案 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")