从 URL 而不是本地文件上传 Selenium 文件
Selenium File upload from URL instead of local file
正在尝试通过 Selenium/ChromeDriver 上传带有 HTML 输入元素的文件。
如果文件是本地文件,一切正常。
但我需要从 URL 上传。在这种情况下,驱动程序会抛出错误。
如果我手动上传带有 chrome 的 URL(点击“Select 文件”并将 URL 粘贴为文件名并点击确定),上传的效果如下预期。
HTML:
<input type="file" name="file1">
C#代码:
var driver = new ChromeDriver();
driver.Navigate().GoToUrl("<URL HERE>");
var input = driver.FindElement(By.Name(name));
ele.SendKeys("C:\pic.png"); //works because local file exists
ele.SendKeys("https://wikipedia.org/static/favicon/wikipedia.ico"); //fails
异常:
OpenQA.Selenium.WebDriverException: "无效参数:找不到文件:https://wikipedia.org/static/favicon/wikipedia.ico
(会话信息:chrome=92.0.4515.131)“
我发现抛出异常是因为驱动程序 DefaultFileDetector 无法将其解析为文件。
所以我尝试实现自己的 FileDetector 并将其分配给驱动程序:
var allowsDetection = driver as IAllowsFileDetection;
if (allowsDetection != null)
{
allowsDetection.FileDetector = new DummyFileDetector();
}
虚拟文件检测器:
class DummyFileDetector : IFileDetector
{
public bool IsFile(string keySequence)
{
return true;
}
}
但是DummyFileDetector.IsFile从来没有被调用过(似乎allowsDetection.FileDetector = new DummyFileDetector()没有改变驱动的FileDetector)
我不想先下载文件再上传(如果可能的话)。如前所述,在文件选择对话框中手动设置 URL 可以解决问题,但对于 Selenium 则不行。
有什么想法吗?
我以前从未使用过 C#,但我认为解决此问题的一个非常简单的方法是下载文件,重新上传,然后删除它。我相信你可以在 C# 中做到这一点。我知道在 selenium python 中做到这一点非常简单,但我认为 python 代码在这里不会有帮助 (lol)
我在这里和其他 Internet 资源上搜索了很多问题,发现使用 driver.SendKeys()
方法从外部 URL 上传文件的唯一方法是先将其下载到本地磁盘,然后然后用 driver.SendKeys()
上传
正在尝试通过 Selenium/ChromeDriver 上传带有 HTML 输入元素的文件。
如果文件是本地文件,一切正常。
但我需要从 URL 上传。在这种情况下,驱动程序会抛出错误。
如果我手动上传带有 chrome 的 URL(点击“Select 文件”并将 URL 粘贴为文件名并点击确定),上传的效果如下预期。
HTML:
<input type="file" name="file1">
C#代码:
var driver = new ChromeDriver();
driver.Navigate().GoToUrl("<URL HERE>");
var input = driver.FindElement(By.Name(name));
ele.SendKeys("C:\pic.png"); //works because local file exists
ele.SendKeys("https://wikipedia.org/static/favicon/wikipedia.ico"); //fails
异常: OpenQA.Selenium.WebDriverException: "无效参数:找不到文件:https://wikipedia.org/static/favicon/wikipedia.ico (会话信息:chrome=92.0.4515.131)“
我发现抛出异常是因为驱动程序 DefaultFileDetector 无法将其解析为文件。
所以我尝试实现自己的 FileDetector 并将其分配给驱动程序:
var allowsDetection = driver as IAllowsFileDetection;
if (allowsDetection != null)
{
allowsDetection.FileDetector = new DummyFileDetector();
}
虚拟文件检测器:
class DummyFileDetector : IFileDetector
{
public bool IsFile(string keySequence)
{
return true;
}
}
但是DummyFileDetector.IsFile从来没有被调用过(似乎allowsDetection.FileDetector = new DummyFileDetector()没有改变驱动的FileDetector)
我不想先下载文件再上传(如果可能的话)。如前所述,在文件选择对话框中手动设置 URL 可以解决问题,但对于 Selenium 则不行。
有什么想法吗?
我以前从未使用过 C#,但我认为解决此问题的一个非常简单的方法是下载文件,重新上传,然后删除它。我相信你可以在 C# 中做到这一点。我知道在 selenium python 中做到这一点非常简单,但我认为 python 代码在这里不会有帮助 (lol)
我在这里和其他 Internet 资源上搜索了很多问题,发现使用 driver.SendKeys()
方法从外部 URL 上传文件的唯一方法是先将其下载到本地磁盘,然后然后用 driver.SendKeys()
上传