Как загрузить изображение на сайт через c# selenium chromedriver?

232
23 августа 2019, 23:30

При нажатии на button на веб-странице появляется стандартное окно загрузки файла. Интересует самый универсальный способ, подходящий под большинство сайтов.

wd.FindElement(By.XPath("//button[.='Загрузить фото']")).Click();
new Actions(wd).SendKeys(@"C:\000.jpg").Build().Perform();
new Actions(wd).SendKeys(OpenQA.Selenium.Keys.Enter).Build().Perform();

Пробовал так, но не работает.

Answer 1

Вообще, SeleniumWebDriver не поддерживает работу с любого рода системными диалогами. Так что в любом случае нужно делать какой-то костыль для реализации этого.

Нам неизвестно что за сайт и какой костыль возможно использовать для конкретно твоего случая.

1. Если поле адреса видимое

HTML

<input type="file" id="uploadhere" />

Selenium Code

IWebElement element = driver.FindElement(By.Id("uploadhere"));
element.SendKeys("C:\\Some_Folder\\MyFile.txt");
2. Если поле адреса НЕвидимое
public void AttachFile(WebDriver driver, By locator, String file) {
  WebElement input = driver.findElement(locator);
  Unhide(driver, input);
  input.sendKeys(file);
}
private void Unhide(WebDriver driver, WebElement element) {
  String script = "arguments[0].style.opacity=1;"
    + "arguments[0].style['transform']='translate(0px, 0px) scale(1)';"
    + "arguments[0].style['MozTransform']='translate(0px, 0px) scale(1)';"
    + "arguments[0].style['WebkitTransform']='translate(0px, 0px) scale(1)';"
    + "arguments[0].style['msTransform']='translate(0px, 0px) scale(1)';"
    + "arguments[0].style['OTransform']='translate(0px, 0px) scale(1)';"
    + "return true;";
  ((JavascriptExecutor) driver).executeScript(script, element);
}
3. Универсальный способ

Анализ трафика и реализации POST реквеста в котором будет аплоадится картинка.

4. Использовать эту библиотеку:

https://github.com/ukushu/DialogCapabilities

5. И САМЫЙ ПРАВИЛЬНЫЙ ДЛЯ ДАНОГО СЛУЧАЯ

вообще забить на использование Selenium для этих задач и использьовать Instagram API.

Который не так давно заимел поддержку аплоада картинок: https://developers.facebook.com/docs/instagram-api/content-publishing

READ ALSO
WPF - Как отследить перерисовку ListBox?

WPF - Как отследить перерисовку ListBox?

Есть коллекция объектов, у каждого их которых есть свойство ParentIdЕсть ListBox, к которому привязана эта коллекция объектов

119
Замена передачи this

Замена передачи this

Можно ли получить BaseClass в ChildClass без передачи его в конструктор?

126
C# форма и 2 tcpserver [закрыт]

C# форма и 2 tcpserver [закрыт]

Нужен совет реализации след структуры1) форма 2) поток с таймером

115
Проверка правильного количества скобок в тексте

Проверка правильного количества скобок в тексте

Как проверить что в тексте каждый '(' закрыт ')'?

139