Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Несканчаемая проблема с загрузкой файла(изображения)

java
webdriver
Теги: #<Tag:0x00007fedbbc58ae0> #<Tag:0x00007fedbbc58978>

(Сергей Попков) #1

Заполняю форму, нужно загрузить в неё изображение
(вот скрин: http://clip2net.com/clip/m480246/1d34f-clip-88kb.png?nocache=1 , вот как это работает https://drive.google.com/file/d/0BzZGSrMh70MiQ1lrOHFLVWdkbjg/view?usp=sharing ), я воспользовался советом который нашёл здесь же среди тем ( https://github.com/tit/upload_file/blob/master/upload_file.java ).
Получилось следующее:

 public void fillCompanyData() throws InterruptedException {    
    explicitWait(By.xpath(".//*[@id='fotoFileUpload']/div[3]/div[2]/a"));
    click(By.xpath(".//*[@id='fotoFileUpload']/div[3]/div[2]/a")); //нажимаю на ссылку для загрузки окна
    explicitWait(By.xpath(".//*[@id='FileModel.Uploaded_TextBox0_Input']")); // жду появления поля для загрузки(здесь не дождётся)
    wd.findElement(By.xpath(".//*[@id='FileModel.Uploaded_TextBox0_Input']")).sendKeys("//D:/Devel/java_Gradle_KK110917/kudkuda/src/test/resources/testpic.jpg");  //проделываю штуку из совета
    click(By.id("btn34369986")); // жму "Загрузить"
  }

В итоге тайм аут(ожидание у меня: visibilityOfElementLocated ) перед локатом поля для файла (By.xpath(".//*[@id=‘FileModel.Uploaded_TextBox0_Input’]"))
Убрал ожидание - NullPointerException у него же.

Поискал нашел ещё один способ:

 public void fillCompanyData() throws InterruptedException {    
    explicitWait(By.xpath(".//*[@id='fotoFileUpload']/div[3]/div[2]/a"));
    click(By.xpath(".//*[@id='fotoFileUpload']/div[3]/div[2]/a")); //нажимаю на ссылку для загрузки окна
    explicitWait(By.xpath(".//*[@id='FileModel.Uploaded_TextBox0_Input']")); // жду появления поля для загрузки(здесь не дождётся)
    File file = new File("D:/Devel/java_Gradle_KK110917/kudkuda/src/test/resources/testpic.jpg");

    wd.findElement(By.xpath(".//*[@id='FileModel.Uploaded_TextBox0_Input']")).sendKeys(file.getAbsolutePath());//проделываю новую штуку

    click(By.id("btn34369986"));

  }

Результат тот же, либо тайм аут, либо NullPointerException.

Может показаться что проблема в локаторе для элемента открывающего выбор файлов, и возможно так и есть, но я не понимаю у него же есть айди как он он может не найтись, вот еще скрин: http://clip2net.com/clip/m480246/1d34f-clip-88kb.png?nocache=1

Или дело в том что он открывается как бы в окне, так в аналогичном случае, в подобном окне я уже заполнял текстовое поле, и всё находилось.

Опыта у меня мало. Уважаемые коллеги помогите пожалуйста разобраться в этой ситуации?


(Ray Romanov) #2

Кхм:
Тут
explicitWait(By.xpath(".//*[@id='FileModel.Uploaded_TextBox0_Input']")); // жду появления поля для загрузки(здесь не дождётся)
элемент “.//*[@id=‘FileModel.Uploaded_TextBox0_Input’]” на странице походу невидимый, видимый следующий, который фейковый вот его и нужно ждать.
Тут
wd.findElement(By.xpath(".//*[@id='FileModel.Uploaded_TextBox0_Input']")).sendKeys("//D:/Devel/java_Gradle_KK110917/kudkuda/src/test/resources/testpic.jpg"); //проделываю штуку из совета
вопрос зачем два слеша перед именем диска?


(Сергей Попков) #3
  1. Проделал, что то пошло не как
public void fillCompanyData() throws InterruptedException {
 
    explicitWait(By.xpath(".//*[@id='fotoFileUpload']/div[3]/div[2]/a"));
    click(By.xpath(".//*[@id='fotoFileUpload']/div[3]/div[2]/a"));
    explicitWait(By.xpath(".//*[@id='FileModel.Uploaded_TextBox0_FakeInput']"));
    wd.findElement(By.xpath(".//*[@id='FileModel.Uploaded_TextBox0_FakeInput']")).sendKeys("D:/Devel/java_Gradle_KK110917/kudkuda/src/test/resources/testpic.jpg");   
    click(By.id("btn34369986"));
  }

Появляется NullPointerException на этой строчке

 wd.findElement(By.xpath(".//*[@id='FileModel.Uploaded_TextBox0_FakeInput']")).sendKeys("D:/Devel/java_Gradle_KK110917/kudkuda/src/test/resources/testpic.jpg");   

Ну хотя бы тайм аута теперь нет.

2 Хороший вопрос) просто опечатка, копировал вставял дописывал, видимо осталось откудато


(Ray Romanov) #4

Я говорил, что нужно поменять то, что ожидаешь но не говорил, что нужно менять элемент в который вводишь!!!


(Сергей Попков) #5
   public void fillCompanyData() throws InterruptedException {
    explicitWait(By.xpath(".//*[@id='fotoFileUpload']/div[3]/div[2]/a"));
    click(By.xpath(".//*[@id='fotoFileUpload']/div[3]/div[2]/a"));
    explicitWait(By.xpath(".//*[@id='FileModel.Uploaded_TextBox0_FakeInput']"));
    wd.findElement(By.xpath(".//*[@id='FileModel.Uploaded_TextBox0_Input']")).sendKeys("D:/Devel/java_Gradle_KK110917/kudkuda/src/test/resources/testpic.jpg");
    click(By.id("btn34369986"));
  }

Ни как((( NullPointerException на тойже строчке


(Ray Romanov) #6

А более подробный лог можно, от фреймворка, селениума и браузера?


(Сергей Кобзарь) #7

У Вас случайно поле для ввода FileModel.Uploaded_TextBox0_Input не находится в iframe? Возможно по этому не находится.

Вот пример кода как у меня реализовано с iframe, возможно он Вам поможет:

[details=Код]```
private final String IMPORTAPPENDINPUT = “//span[contains(.,‘File path’)][@class=‘gfft’]/…/following-sibling::td/input”;
private final String IMPORT_APPEND_FRAME = “//iframe[@class=‘framed-operation’]”;
public TabPage setFilePath(String path) {

	switchTo().frame($(By.xpath(IMPORT_APPEND_FRAME))).findElement(By.xpath(IMPORTAPPENDINPUT))
			.sendKeys(path);
	switchTo().defaultContent();
	return new TabPage(sm);
	
}