웹 테이블 내의 특정 셀에 id나 name 속성을 대체로 지정하지 않을 것입니다
하지만 이럴 때 특정 셀에 접근하기 위해서는 XPath를 사용합니다
우선
<html>
<head>
<title>Sample</title>
</head>
<body>
<table border="1">
<tbody>
<tr>
<td>first cell</td>
<td>second cell</td>
</tr>
<tr>
<td>third cell</td>
<td>fourth cell</td>
</tr>
</tbody>
</table>
</body>
</html>
위의 newhtml.html 파일을 생성하여 실습하겠습니다
Selenium을 이용하여 셀의 두번째의 second cell이라는 텍스트를 콘솔에 print하도록 하겠습니다
WebDriver의 XPath 로케이터는 항상 "//"로 시작한 다음 부모 요소가 옵니다
driver.findElement(By.xpath("//table")).getText();
table의 바로 아래 요소는 tbody이므로 table의 자식이라고 말할 수 있습니다
XPath의 모든 자식 요소는 부모 요소의 오른쪽의 배치되어야 하며 "/"로 구분합니다
driver.findElement(By.xpath("//table/tbody/")).getText();
second에 접근하기 위해서는
table의 첫번째 행에 접근해야 합니다
driver.findElement(By.xpath("//table/tbody//tr[1]")).getText();
table의 첫번째 행의 두번째 열이므로
driver.findElement(By.xpath("//table/tbody//tr[1]/td[2]")).getText();
위의 코드로 second cell이라는 텍스트 요소를 얻을 수 있습니다
package newpackage;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement;//webElement 사용
import org.openqa.selenium.support.ui.Select;//Select 사용
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;//Action 사용
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.Alert;//alert 사용
import java.util.Iterator;
import java.util.Set;
public class MyClass {
public static void main(String[] args) throws InterruptedException{
System.setProperty("webdriver.chrome.driver", "c:/selenium/chromedriver.exe");
WebDriver driver = new ChromeDriver();
String getURL = " ";//newhtml.html의 위치정보를 넣으십시오
driver.get(getURL);
String innerText = driver.findElement(By.xpath("//table/tbody/tr[1]/td[2]")).getText();
System.out.println(innerText);
driver.quit();
}
}
완성된 코드의 결과는
위와 같이 출력됩니다
<html>
<head>
<title>Sample</title>
</head>
<body>
<table border="1">
<tbody>
<tr>
<td>first cell</td>
<td>second cell</td>
</tr>
<tr>
<td>third cell</td>
<td>
<table border="1">
<tbody>
<tr>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>4</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</body>
</html>
ㅇ이중테이블 같은 경우에도 같은 방식으로 접근하면 됩니다
package newpackage;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement;//webElement 사용
import org.openqa.selenium.support.ui.Select;//Select 사용
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;//Action 사용
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.Alert;//alert 사용
import java.util.Iterator;
import java.util.Set;
public class MyClass {
public static void main(String[] args) throws InterruptedException{
System.setProperty("webdriver.chrome.driver", "c:/selenium/chromedriver.exe");
WebDriver driver = new ChromeDriver();
String getURL = " ";//newhtml.html의 위치정보를 넣으십시오
driver.get(getURL);
String innerText = driver.findElement(By.xpath("//table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td")).getText();
System.out.println(innerText);
driver.quit();
}
}
XPath를 활용하여 동적 WebTable에서 행이나 열의 수를 가져올 수 있습니다
Web Table Elements
Top Gainers BSE | NSE Last updated: 11 Dec, 13:51
demo.guru99.com
위 페이지를 활용하였습니다
package newpackage;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement;//webElement 사용
import org.openqa.selenium.support.ui.Select;//Select 사용
import java.text.ParseException;
import java.util.List;
public class MyClass {
public static void main(String[] args) throws ParseException{
System.setProperty("webdriver.chrome.driver", "c:/selenium/chromedriver.exe");
WebDriver driver = new ChromeDriver();
String getURL = "http://demo.guru99.com/test/web-table-element.php";
driver.get(getURL);
List <WebElement> col = driver.findElements(By.xpath("//*[@id=\"leftcontainer\"]/table/thead/tr/th"));
System.out.println("cols: "+col.size());
List <WebElement> row = driver.findElements(By.xpath("//*[@id=\"leftcontainer\"]/table/tbody/tr/td[1]"));
System.out.println("rows: "+row.size());
driver.close();
}
}
위 코드를 활용하면 아래의 결과를 얻을 수 있습니다
또 동적 WebTable의 값을 가져올 수 있습니다
테이블의 세번째 행의 정보와 세번째행의 두번째 정보를 콘솔창에 출력하도록 합니다
일정 시간마다 내용이 업데이트되므로 실습할 때마다 내용이 다를 것입니다
package newpackage;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement;//webElement 사용
import org.openqa.selenium.support.ui.Select;//Select 사용
import java.text.ParseException;
import java.util.List;
public class MyClass {
public static void main(String[] args){
System.setProperty("webdriver.chrome.driver", "c:/selenium/chromedriver.exe");
WebDriver driver = new ChromeDriver();
String getURL = "http://demo.guru99.com/test/web-table-element.php";
driver.get(getURL);
WebElement getTable = driver.findElement(By.tagName("table"));
WebElement tableRow = getTable.findElement(By.xpath("//*[@id=\"leftcontainer\"]/table/tbody/tr[3]"));
String rowTxt = tableRow.getText();
System.out.println("Third row of table: " + rowTxt);
WebElement groupCell = tableRow.findElement(By.xpath("//*[@id=\"leftcontainer\"]/table/tbody/tr[3]/td[2]"));
String groupCellTxt = groupCell.getText();
System.out.println("Group Info. " + groupCellTxt);
driver.close();
}
}
Current Price 중 가장 큰 값을 출력할 수 있습니다
package newpackage;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement;//webElement 사용
import org.openqa.selenium.support.ui.Select;//Select 사용
import java.text.ParseException;
import java.util.List;
import java.text.NumberFormat;
public class MyClass {
public static void main(String[] args) throws ParseException {
System.setProperty("webdriver.chrome.driver", "c:/selenium/chromedriver.exe");
WebDriver driver = new ChromeDriver();
String getURL = "http://demo.guru99.com/test/web-table-element.php";
driver.get(getURL);
List <WebElement> col = driver.findElements(By.xpath("//*[@id=\"leftcontainer\"]/table/thead/tr/th"));
System.out.println("col size: "+col.size());
List <WebElement> row = driver.findElements(By.xpath("//*[@id=\"leftcontainer\"]/table/tbody/tr/td[1]"));
System.out.println("row size: "+row.size());
String Max;
double m=0, r=0;
for(int i=1; i<row.size();i++){
Max = driver.findElement(By.xpath("//*[@id=\"leftcontainer\"]/table/tbody/tr[" + (i+1) + "]/td[4]")).getText();
NumberFormat f = NumberFormat.getNumberInstance();
Number num = f.parse(Max);
Max = num.toString();
m=Double.parseDouble(Max);
if(m>r){
r=m;
}
}
System.out.println("MAX Current Price is " + r);
driver.close();
}
}
웹 테이블을 찾고 총 행 수를 얻습니다
List <WebElement> col = driver.findElements(By.xpath("//*[@id=\"leftcontainer\"]/table/thead/tr/th"));
List <WebElement> row = driver.findElements(By.xpath("//*[@id=\"leftcontainer\"]/table/tbody/tr/td[1]"));
for로 매 행의 특정 열 값들을 비교하여 최대 값을 찾습니다
'테스트툴 > Selenium' 카테고리의 다른 글
Selenium Webdriver 모든 링크와 연결할 수 없는 링크 찾기 (0) | 2021.04.07 |
---|---|
Selenium Webdriver 툴 팁 (0) | 2021.04.03 |
Selenium 경고, 팝업 창 처리하기 (0) | 2021.03.21 |
Selenium 파일 업로드 (0) | 2021.03.20 |
Selenium 마우스 이벤트와 키보드 이벤트 (0) | 2021.03.19 |