nhận loại phần tử invaild TRONG SELENIUM
làm việc trên Linux ubuntu 20.04 với phiên bản cộng đồng intellij IDEA mới nhất với firefox và geckodriver
Tôi đang cố lấy một số lịch trình từ một trang web và sao chép chúng vào tệp .txt (hoặc danh sách không quan trọng)
Tôi đang thử cái này:
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(2000, TimeUnit.MILLISECONDS); //MAXIMUM WAIT TIME
driver.get("http://telematics.oasa.gr/#main");
driver.findElement(By.xpath("//option[contains(.,'021')]")).click();//selecting trip
List<WebElement> oas = driver.findElements(By.xpath("//div/ul/li"));
System.out.println(oas.size());
System.out.println(oas);
trang liên kết : http://telematics.oasa.gr/#lineDetails_1151_021%20:%20%CE%A0%CE%9B%CE%91%CE%A4%CE%95%CE%99%CE%91%20%CE%9A%CE%91%CE%9D%CE%99%CE%93%CE%93%CE%9F%CE%A3%20-%20%CE%93%CE%9A%CE%A5%CE%96H%20(%CE%9A%CE%A5%CE%9A%CE%9B%CE%99%CE%9A%CE%97)_9-86
đây là html của trang:
<li class="list-group-item scheduleEntryL"><button type="button" class="btn btn-info btn-circle" style="cursor:default;">07</button> 07:10 07:25 07:40 07:55 </li>
và sau đó đầu ra là:
19
[[[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li]]
có nghĩa là danh sách của tôi có 19 phần tử nhưng nó không phải là thứ tôi muốn
//TÓM LƯỢC
- Loại phần tử tôi nhận được không đúng
danh sách nên chứa:
[..., 07: 00,07: 10,07: 25, ....]
2. Nó phải chứa 59 độ cao vì có 59 điểm khởi hành được đưa ra trong trang nhưng một số chúng nằm trên cùng một dòng
trang có 19 dòng vì vậy nó có thể đưa ra mọi dòng là MỘT phần tử và đây cũng không phải là điều tôi muốn
HÃY GIÚP TÔI
// TÔI ĐÃ KIỂM TRA CÁC BÀI ĐĂNG TƯƠNG TỰ TRÊN TRANG NÀY VÀ KHÔNG GIÚP ĐƯỢC
Trả lời
Bạn đang sử dụng xpath sẽ trả về các hàng từ trang nhưng không trả về các phần tử thực có chứa các giá trị bắt buộc. Ngoài ra, các giá trị văn bản nằm giữa hai nút, vì vậy chúng ta cần sử dụng JavaScript cho nó.
//Code to extract Departure time without *
List<WebElement> oas = driver.findElements(By.xpath("//li[@class='list-group-item scheduleEntryL']"));
LinkedList<String> timeValues = new LinkedList<String>();
String myCountryProxy = null;
for(WebElement element:oas)
{
//As text is between two nodes, we need to use javaScript as selenium getText() method didn't work for it
//So in below javaScript, we refer to oas as parent element as then we try to find node which contain text as childNode. In this code its 2nd child node so we have passed value as 1: childNodes[1]
myCountryProxy = ((JavascriptExecutor)driver).executeScript("return arguments[0].childNodes[1].textContent;", element).toString();
//Code to remove extra space from String
if(!myCountryProxy.equalsIgnoreCase(" "))
{
myCountryProxy = myCountryProxy.replaceAll(" "," ").replaceAll(" ","").replaceAll(" ","");
myCountryProxy = myCountryProxy.trim();
//Split string into individual value
String[] split = myCountryProxy.split("\\s+");
for(String str:split)
{
timeValues.add(str);
}
}
}
//Code to extract departure time values with *: 05:00*
oas = driver.findElements(By.xpath("//span[@class='xtra']"));
for(WebElement element:oas)
{
//here node which contains text is 1st child node only, so we have passed value as childNodes[0]
myCountryProxy = ((JavascriptExecutor)driver).executeScript("return arguments[0].childNodes[0].textContent;", element).toString();
timeValues.add(myCountryProxy);
}
//Code to extract departure values which are same line of time with * i.e.: 05:10 05:30 05:50
oas = driver.findElements(By.xpath("//li[@class='list-group-item scheduleEntryL']/span"));
if(oas.size()>0)
{
oas = driver.findElements(By.xpath("//li[@class='list-group-item scheduleEntryL']/span/.."));
for(WebElement element:oas)
{
//here node which contains text is 4th child node, so we have passed value as childNodes[4]
myCountryProxy = ((JavascriptExecutor)driver).executeScript("return arguments[0].childNodes[3].textContent;", element).toString();
//Code to remove extra space from String
if(!myCountryProxy.equalsIgnoreCase(" "))
{
myCountryProxy = myCountryProxy.replaceAll(" "," ").replaceAll(" ","").replaceAll(" ","");
myCountryProxy = myCountryProxy.trim();
//Split string into individual value
String[] split = myCountryProxy.split("\\s+");
for(String str:split)
{
timeValues.add(str);
}
}
}
}
System.out.println(timeValues);
Tôi có mã đã thực thi này ở cuối và nhận được kết quả bên dưới:
[06:10, 06:25, 06:40, 06:55, 07:05, 07:15, 07:25, 07:35, 07:45, 07:55, 08:05, 08:20, 08:30, 08:40, 08:55, 09:05, 09:15, 09:30, 09:50, 10:10, 10:25, 10:45, 11:00, 11:20, 11:35, 11:55, 12:10, 12:30, 12:45, 13:20, 13:40, 13:55, 14:10, 14:25, 14:35, 14:45, 15:00, 15:10, 15:20, 15:35, 15:45, 15:55, 16:10, 16:20, 16:30, 16:45, 16:55, 17:05, 17:20, 17:35, 17:55, 18:15, 18:30, 18:45, 19:00, 19:20, 19:35, 19:55, 20:10, 20:25, 20:40, 21:00, 21:20, 21:40, 22:05, 22:30, 22:55, 05:00*, 23:20*, 05:10, 05:30, 05:50]
Xin lưu ý, tôi đã thêm các giá trị từ hàng chứa thời gian với *, ở cuối danh sách. Vì vậy, bạn sẽ tìm thấy các giá trị đó ở cuối danh sách.
Để trích xuất văn bản giữa các nút, tôi đã tham khảo: bài đăng SO này
Ngoài ra, nếu bạn muốn chọn giá trị thả xuống, hãy sử dụng Selectlớp selen:
Select select = new Select(driver.findElement(By.id("lineSelect")));
//to select drop down value: 021 : ΠΛΑΤΕΙΑ ΚΑΝΙΓΓΟΣ - ΓΚΥΖH (ΚΥΚΛΙΚΗ)
select.selectByValue("1151_54_9");