Jak dodać dane na końcu linii w pliku tekstowym

0

Witajcie,
Mam napisany program, który korzysta z pliku tekstowego .csv, Program odczytuje dane (jest w linii np. 10 danych) do tablicy "wiersz" (dane rozrzucone splitem).
Po odczytaniu mam do nich dostęp i mogę z nich korzystać algorytmem.
Po zakończeniu pracy z tymi danymi, chciałbym ten wiersz oznaczyć, dodając na końcu linii nową pozycję ";1", co by oznaczało, że te dane zostały już obrobione. Wtedy bazowy kod najpierw by sprawdzał, czy dane mają na końcu linii znacznik "1" i jeśli tak, to by je pomijały.
I tu pytanie: jak dodać dane na koniec linii?

pytanie 2:
Mam taki element:
driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div/div/div[2]/table/tbody/tr/td[1]/table/tbody/tr/td[2]/table/tbody/tr[2]/td[2]/em/button")).click();

jak napisać kod, który by najpierw sprawdził, czy taki element jest widoczny na ekranie? (selenium/eclipse) - zdarza mi się, że taki element nie jest jeszcze widoczny na ekranie a kod próbuje coś z nim zrobić

dziękuję za pomoc

0

I tu pytanie: jak dodać dane na koniec linii?

A tu moje pytanie, co już napisałeś i jakiej biblioteki do csv używasz? bo od tego zależy głownie odpowiedź

0

@KamilAdam:

package test;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;


public class app_test {

               public static void main(String[] args) throws InterruptedException, IOException {
                               // Project Explorer-> SeleniumTEST -> Properties-> JavaBuildPath ->Libriaries -> Add External Jars -> dodać wszystkie JARY z kat Selenium
                              //Ścieżka do ChromeDrivera (musi być w takiej wersji jak Chrome na zainstalowany na kompie
                               System.setProperty("webdriver.chrome.driver", "C:\\chromedriver\\chromedriver.exe");
                               WebDriver driver = new ChromeDriver();
                               Actions actions = new Actions(driver);
  
                               //Plik z danymi
File file = new File("C:\\automat\\test.csv");

                             Scanner odczyt = new Scanner(file);                            

       
                               // Applied wait time
                               driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

                               // maximize window
                               driver.manage().window().maximize();
                                // open browser with desried URL

driver.get("https://.............");

 

driver.findElement(By.id("Login")).sendKeys(".........");
driver.findElement(By.id("Haslo")).sendKeys(".........");
                               driver.findElement(By.id("ButtonLogowanie")).click();

 
driver.get("https:...................");
                               Thread.sleep(1000);
                               driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div/div/div[2]/table/tbody/tr/td[1]/table/tbody/tr/td[2]/table/tbody/tr[2]/td[2]/em/button")).click();
                                Thread.sleep(1000);
                                
                               
                                
                                actions.moveToElement(driver.findElement(By.xpath("/html/body/div[7]/ul/li[3]/a/span"))).perform();
                               Thread.sleep(1000);
                               
                               //Wybór szkoły na liście -> Li [ ] 
driver.findElement(By.xpath("/html/body/div[9]/ul/li[3]/a/span")).click();


                               Thread.sleep(1000);


          while(odczyt.hasNextLine()) {
 driver.get("https:.............");
             String zdanie = odczyt.nextLine();
             String[] wiersz = zdanie.split(";");

                                            
             //Wybieranie miesiąca na podstawie cyferki z pierwszej kolumny z pliku
             Thread.sleep(1000);
             driver.findElements(By.className("pencil")).get(Integer.parseInt(wiersz[0])).click();
             Thread.sleep(1000);
                                           
             //wejście w zakładkę "dokumenty"/"wynagrodzenia"   -> Li [] - nr zakładki (licząc od 1) 2=Wynagrodzenia, 3=Dokumenty
driver.findElement(By.xpath("/html/body/div[2]/div/div[2]/div[1]/div/div/div/div/form/div[2]/div[1]/div[1]/ul/li[2]/a[2]/em/span/span")).click();
                                           
                                            
             //Wybieranie kategorii na podstawie cyferki z drugiej kolumny z pliku
             Thread.sleep(1500);
             driver.findElements(By.className("add")).get(Integer.parseInt(wiersz[1])).click();

             // wpisywanie do formularza
             Thread.sleep(1000);
             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_1']")).clear();
             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_1']")).sendKeys(wiersz[2]);
             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_5']")).click();
             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_2']")).sendKeys(wiersz[3]);
             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_4']")).sendKeys(wiersz[4]);
             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_3']")).sendKeys(wiersz[5]);
             
             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_5']")).sendKeys(wiersz[6]);
             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_6']")).sendKeys(wiersz[7]);
             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_10']")).sendKeys(wiersz[8]);
             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_7']")).sendKeys(wiersz[9]);
             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_11_w']")).sendKeys(wiersz[10]);
             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_12_w']")).sendKeys(wiersz[11]);
             
             
             FileWriter fr = new FileWriter(file, true);
             BufferedWriter br = new BufferedWriter(fr);
             PrintWriter pr = new PrintWriter(br);
             pr.println("data");
             pr.close();
             br.close();
             fr.close();
             

             
             
             
             
             
             
             
             // zapisanie
             driver.findElement(By.xpath("//*[contains(text(),'Zapisz')]")).click();
             Thread.sleep(5000);
                              
             }

               odczyt.close();
               // closing the browser

               // driver.close();

                }

 

}
0

Program służy do wklepywania danych na stronie www i mam z nim taki problem, że czasami coś się wydarzy i przerwie działanie tego programu i nie wiadomo, które dane zostały już wprowadzone. Dlatego chciałem oflagować linie w pliku, żeby drugi raz już nie wchodziły.
Druga modyfikacja, to sprawdzenie czy element jest widoczny na ekranie a jeśli nie jest to zapętlenie jakiegoś małego "waita"

0

Takie cos:

pole1,pole2,pole3,pole4
a,b,c,d,1
a,b,c,d
a,b,c,d

to nie jest poprawny CSV. A przynajmniej niezbyt rozgarniety.

Lepiej zebys mial cos ala

pole1,pole2,pole3,pole4,skip
a,b,c,d,true
a,b,c,d,false
a,b,c,d,false

Dodac domyslne wartosci mozesz jakims prostym skryptem co do kazdej liniji dolozy ,false

EDIT:

Program służy do wklepywania danych na stronie www i mam z nim taki problem, że czasami coś się wydarzy i przerwie działanie tego programu i nie wiadomo, które dane zostały już wprowadzone. Dlatego chciałem oflagować linie w pliku, żeby drugi raz już nie wchodziły.

Brzmi jak https://en.wikipedia.org/wiki/XY_problem

0

@stivens:
pole1,pole2,pole3,pole4,skip
a,b,c,d,true
a,b,c,d,false
a,b,c,d,false

Mogę dysponować bazowo plikiem w takiej strukturze, ale nadal nie wiem, jak zmienić ostatnią wartość z false na true? Gdyby zastosować tą logikę, to plik byłby taki:
pole1,pole2,pole3,pole4,skip
false, a,b,c,d
false, a,b,c,d
false,a,b,c,d

czyli falsa na pierwszym miejscu. Jak w takim razie po odczytaniu całej linii zmienić false na true?

0

próbuję tak:
while (driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div/div/div[2]/table/tbody/tr/td[1]/table/tbody/tr/td[2]/table/tbody/tr[2]/td[2]/em/button")).size() = 0) {
Thread.sleep(100);
}

                           driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div/div/div[2]/table/tbody/tr/td[1]/table/tbody/tr/td[2]/table/tbody/tr[2]/td[2]/em/button")).click();

ale wywala mi błąd:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The left-hand side of an assignment must be a variable

próbuję w oparciu o ten przykład:
To check Element Present:

if(driver.findElements(By.xpath("value")).size() != 0){
System.out.println("Element is Present");
}else{
System.out.println("Element is Absent");
}

0

ale nadal nie wiem, jak zmienić ostatnią wartość z false na true

No to zalezy od np. biblioteki do obslugi tego CSV.

Przypominam, ze to problem XY (to co opisujesz nie powinno sie dziac) ale jakbym mial isc po linii najnizszego oporu to bym sobie zrobil plik gdzie bym trzymal nr. ostatniej obsluzonej linijki.

Czyli jakies

process(line)
file.lseek(0).write(lineNumber) // pseudokod - tak nie zadziala i w sumie jest buggy
file.flush()

Uwaga: mozliwy race condition

process(line)
// co sie stanie jesli w tym momencie (po przetworzeniu ale przed updatem numeru lini) nastapi przerwanie?
file.lseek(0).write(lineNumber)
0

@stivens:

  1. to może proście wykasować z pliku wiersz już zaczytany?
  2. jak mi się uda ogarnąć "wstrzymanie" działania skryptu do czasu załadowania elementu na ekran to prawdopodobnie tego problemu już nie będzie
0

Ale dlaczego przetworzenie calego pliku nie moze odbyc sie atomowo? Albo chociaz z wywlaszczaniem ale nie z wywalaniem calego skryptu xD

0

@stivens:
Co to znaczy atomowo? Skrypt się wywala, jak próbuję na ekranie wykonać akcję na elemencie, którego z jakiegoś powodu nie widać (np. serwer nie dostarczył danych do przeładowania strony i elementu jeszcze nie ma) - dlatego chciałbym wprowadzić dynamiczne opóźnienie, badając "dostępność" elementu

0

To moze powinienes to opakowac w jakies try-catch?

0
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(lastElementToLoad));

https://www.google.com/amp/s/artoftesting.com/wait-for-page-to-load-selenium-webdriver-java

0

@stivens:
Podałbyś przykład z mojego kodu na jeden element?

2

Nie czytam Twojego kodu bo go nie sformatowales nawet ;)

0

Załączyłem plik

0
package test;
			
			import java.io.BufferedWriter;
			import java.io.File;
			import java.io.FileNotFoundException;
			import java.io.FileWriter;
			import java.io.IOException;
			import java.io.PrintWriter;
			import java.util.Scanner;
			import java.util.concurrent.TimeUnit;
			import org.openqa.selenium.By;
			import org.openqa.selenium.WebDriver;
			import org.openqa.selenium.chrome.ChromeDriver;
			import org.openqa.selenium.interactions.Actions;
			
			
			public class app_test {
			
			               public static void main(String[] args) throws InterruptedException, IOException {
			                               // Project Explorer-> SeleniumTEST -> Properties-> JavaBuildPath ->Libriaries -> Add External Jars -> dodać wszystkie JARY z kat Selenium
			                              //Ścieżka do ChromeDrivera (musi być w takiej wersji jak Chrome na zainstalowany na kompie
			                               System.setProperty("webdriver.chrome.driver", "C:\\chromedriver\\chromedriver.exe");
			                               WebDriver driver = new ChromeDriver();
			                               Actions actions = new Actions(driver);
			  
			                               //Plik z danymi
			File file = new File("C:\\automat\\test.csv");
			
			                             Scanner odczyt = new Scanner(file);                            
			
			       
			                               // Applied wait time
			                               driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
			
			                               // maximize window
			                               driver.manage().window().maximize();
			                                // open browser with desried URL
			
			driver.get("https:=RYB");
			
			 
			
			driver.findElement(By.id("Login")).sendKeys("");
			driver.findElement(By.id("Haslo")).sendKeys("");
			                               driver.findElement(By.id("ButtonLogowanie")).click();
			
			 
			driver.get("https:.aspx");
			                               
			                               while  (driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div/div/div[2]/table/tbody/tr/td[1]/table/tbody/tr/td[2]/table/tbody/tr[2]/td[2]/em/button")).size() = 0) {
			                            	   Thread.sleep(100);  
			                               }
			                            		   
			                               driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div/div/div[2]/table/tbody/tr/td[1]/table/tbody/tr/td[2]/table/tbody/tr[2]/td[2]/em/button")).click();
			                                Thread.sleep(1000);
			                                
			                               
			                                
			                                actions.moveToElement(driver.findElement(By.xpath("/html/body/div[7]/ul/li[3]/a/span"))).perform();
			                               Thread.sleep(1000);
			                               
			                               //Wybór szkoły na liście -> Li [ ] 
			driver.findElement(By.xpath("/html/body/div[9]/ul/li[3]/a/span")).click();
			
			                               // niepotzrebne bo wczensiej na ta strone pzrechodzimy juz - adresowanie po
			                               // nazwie, wybór elementu z listy znalezionych nazw
			                               // driver.findElements(By.xpath("//*[contains(text(),'Rozliczenie
			                               // dotacji')]")).get(0).click();
			                               // driver.findElements(By.xpath("//*[contains(text(),'Rozliczenie
			                               // dotacji')]")).get(2).click();
			                               // sleep zeby wczytał sie do konca skrypt
			                               Thread.sleep(1000);
			
			
			          while(odczyt.hasNextLine()) {
			 driver.get("https:/i.aspx");
			             String zdanie = odczyt.nextLine();
			             String[] wiersz = zdanie.split(";");
			             //System.out.print(wiersz[0]);
			             //System.out.print(wiersz[1]);
			             //System.out.print(wiersz[2]);
			             //System.out.print(wiersz[3]);
			                                            
			             //Wybieranie miesiąca na podstawie cyferki z pierwszej kolumny z pliku
			             Thread.sleep(1000);
			             driver.findElements(By.className("pencil")).get(Integer.parseInt(wiersz[0])).click();
			             Thread.sleep(1000);
			                                           
			             //wejście w zakładkę "dokumenty"/"wynagrodzenia"   -> Li [] - nr zakładki (licząc od 1) 2=Wynagrodzenia, 3=Dokumenty
			driver.findElement(By.xpath("/html/body/div[2]/div/div[2]/div[1]/div/div/div/div/form/div[2]/div[1]/div[1]/ul/li[2]/a[2]/em/span/span")).click();
			                                           
			                                            
			             //Wybieranie kategorii na podstawie cyferki z drugiej kolumny z pliku
			             Thread.sleep(1500);
			             driver.findElements(By.className("add")).get(Integer.parseInt(wiersz[1])).click();
			
			             // wpisywanie do formularza
			             Thread.sleep(1000);
			             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_1']")).clear();
			             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_1']")).sendKeys(wiersz[2]);
			             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_5']")).click();
			             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_2']")).sendKeys(wiersz[3]);
			             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_4']")).sendKeys(wiersz[4]);
			             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_3']")).sendKeys(wiersz[5]);
			             
			             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_5']")).sendKeys(wiersz[6]);
			             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_6']")).sendKeys(wiersz[7]);
			             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_10']")).sendKeys(wiersz[8]);
			             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_7']")).sendKeys(wiersz[9]);
			             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_11_w']")).sendKeys(wiersz[10]);
			             driver.findElement(By.cssSelector(".x-resizable-pinned [name='_12_w']")).sendKeys(wiersz[11]);
			             
			             
           
			             
			             
			             // zapisanie
			             driver.findElement(By.xpath("//*[contains(text(),'Zapisz')]")).click();
			             Thread.sleep(5000);
			                              
			             }
			
			               odczyt.close();

			
			                }
			
			 
			
			}
0

To jeszcze zapytam - jak to przerobić, aby to nie wywalało błędu (The left-hand side of an assignment must be a variable):

        while  (driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div/div/div[2]/table/tbody/tr/td[1]/table/tbody/tr/td[2]/table/tbody/tr[2]/td[2]/em/button")).size() = 0) {
		                            	   Thread.sleep(100);  
		                               }   
        driver.findElement(By.xpath("/html/body/div[1]/div/div/div/div/div/div[2]/table/tbody/tr/td[1]/table/tbody/tr/td[2]/table/tbody/tr[2]/td[2]/em/button")).click();

Chodzi mi o to, żeby czekać w interwałach 100ms na wyświetlenie tego elementu, a jak już się pojawi to go kliknąć.

0

Juz Ci odpowiadalem. W while masz = a ma byc ==.

Co do reszty kodu to moze pozniej do niego zajrze bo chwilowo nie mam czasu

EDIT: w kazdym razie: https://www.w3schools.com/java/java_try_catch.asp

0

@stivens: dzięki.

To w zasadzie wystarczyłoby mi info jak sprawdzić, czy te elementy są już widoczne:

    driver.findElements(By.className("pencil")).get(Integer.parseInt(wiersz[0])).click();
    driver.findElement(By.xpath("/html/body/div[2]/div/div[2]/div[1]/div/div/div/div/form/div[2]/div[1]/div[1]/ul/li[2]/a[2]/em/span/span")).click();
    driver.findElements(By.className("add")).get(Integer.parseInt(wiersz[1])).click();
0

No jesli ich nie ma to wnioskuje, ze Twoj program sie wysypuje z wyjatkiem. Tak?

Jesli tak to opakowujesz takie wyszukiwanie elementu w try-catch i jesli cos nie bedzie dostepne to rzuci Ci wyjatkiem, ktory przechwycisz.

while (true) {
    try {
        driver.findElements(By.className("pencil")).get(Integer.parseInt(wiersz[0])).click();
        driver.findElement(By.xpath("/html/body/div[2]/div/div[2]/div[1]/div/div/div/div/form/div[2]/div[1]/div[1]/ul/li[2]/a[2]/em/span/span")).click();
        driver.findElements(By.className("add")).get(Integer.parseInt(wiersz[1])).click();

        break;
    }
    catch (Exception e) {
        Thread.sleep(100); 
        continue;
    }
}
0

@stivens: Dokładnie. Mam w kodzie takie akcje w różnych miejscach. Te 3 przykładowe akcje na elementach podałem jako przykład, ale one są w różnych miejscach kodu, a chciałbym tą mechanikę zastosować do każdego. Czyli muszę tego while'a powtórzyć w kodzie 3 razy? ( wtedy w bloku "try" będę miał po jednej linijce akcji "driver....click")

Edit: wrzuciłem ten blok 3 razy i na razie działa i nie wywala - testuję dalej, ale wygląda optymistycznie:) Dziękuję

0

Chyba jednak nie działa.
Zrobiłem taki blok (pozostałe 2 są analogiczne):

			             //wejście w zakładkę "dokumenty"/"wynagrodzenia"   -> Li [] - nr zakładki (licząc od 1) 2=Wynagrodzenia, 3=Dokumenty
			             ile=0;
			             while (true) {
			            	    try {
			            	        driver.findElement(By.xpath("/html/body/div[2]/div/div[2]/div[1]/div/div/div/div/form/div[2]/div[1]/div[1]/ul/li[2]/a[2]/em/span/span")).click();
			            	        System.out.println("Dokumenty: " + ile);
			            	        break;
			            	    }
			            	    catch (Exception e) {
			            	        Thread.sleep(100);
			            	        ile=ile+1;
			            	        continue;
			            	    }
			            	}      

Zliczam ile razy jest generowany wyjątek i ciągle mi pokazuje 0:

Pencil 0
Dokumenty: 0
Dodaj dok: 0
Pencil 0
Dokumenty: 0
Dodaj dok: 0
Pencil 0
Dokumenty: 0
Dodaj dok: 0
Pencil 0

Aż go wyrzuciło, czyli nie wszedł w wyjątek.

0

Łapie błąd:

			             //wejście w zakładkę "dokumenty"/"wynagrodzenia"   -> Li [] - nr zakładki (licząc od 1) 2=Wynagrodzenia, 3=Dokumenty
			             ile=0;
			             while (true) {
			            	    try {
			            	        driver.findElement(By.xpath("/html/body/div[2]/div/div[2]/div[1]/div/div/div/div/form/div[2]/div[1]/div[1]/ul/li[2]/a[2]/em/span/span")).click();
			            	        System.out.println("Dokumenty: " + ile);
			            	        break;
			            	    }
			            	    catch (Exception e) {
			            	        Thread.sleep(100);
			            	        ile=ile+1;
			            	        System.out.println("błąd");
			            	        continue;
			            	    }
			            	}      
błąd
błąd
błąd
Dokumenty: 3
Dodaj dok: 0
Pencil 0
błąd
błąd
błąd
błąd

Ale nie potrafi z jakiegoś powodu znowu kliknąć. Jak mu ręcznie kliknę to potem od razu kontynuuje działanie.

0

Problem jest taki, że drugi blok (który klika w element, który powinien się pokazać w wyniku poprawnego kliknięcia z bloku nr 1) - nie jest widoczny, mimo, że While z bloku 1 zwrócił TRUE i poszło dalej.

0

Pokaz wszystkie 3

Swoja droga to te elementy nie maja jakiegos id? Serio musisz do nich wchodzic podajac cala trase po DOM-ie?

Aha i jaki to blad w sumie? Wyswietl message z wyjatku

0

Nie mają ID - serio.
Potestuję jeszcze i dam znać.

0

Na razie lata.....

1

To znaczy dziala?

0

@stivens: tak, dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1