본문 바로가기

테스트툴/Selenium

Selenium 웹 테이블

웹 테이블 내의 특정 셀에 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();
	}
}

완성된 코드의 결과는

Console 결과

위와 같이 출력됩니다

<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();
	}
}

Console 결과

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();
	}
}

위 코드를 활용하면 아래의 결과를 얻을 수 있습니다

Console 결과

동적 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();
	}
}

Console 결과

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로 매 행의 특정 열 값들을 비교하여 최대 값을 찾습니다

Console 결과