TIL (2023.01.13)

leverest96·2023년 1월 13일
0
post-thumbnail

오늘은 Selenium을 이용하여 명절 기차표 예매 프로그램을 만들었다.

매진일 경우 새로고침, 자리가 나면 예매가 되게 만드는 것이었다.

아래는 오늘 만든 코드...

더 클린한 코드를 만들 수 있었을 것 같지만 주어진 시간 내에서는 나의 최선이었다....

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.Select;

public class RailTicket {

	public static void main(String[] args) throws InterruptedException {
		WebDriver driver = new ChromeDriver();
		
		driver.get("https://etk.srail.kr/main.do");
		
		String srtMain = driver.getWindowHandle();
		
		driver.switchTo().window(srtMain);
		
		Thread.sleep(1000);
		
		WebElement login = driver.findElement(By.cssSelector("#wrap > div.header.header-e > div.global.clear > div > a:nth-child(2)"));

		login.click();
		
		WebElement loginNumber = driver.findElement(By.cssSelector("#srchDvNm01"));
		WebElement password = driver.findElement(By.cssSelector("#hmpgPwdCphd01"));
		
		loginNumber.sendKeys("2284978110");
		password.sendKeys("tvbgsd96@");
		
		WebElement loginConfirm = driver.findElement(By.cssSelector("#login-form > fieldset > div.input-area.loginpage.clear > div.fl_l > div.con.srchDvCd1 > div > div.fl_r > input"));

		loginConfirm.click();
		
		WebElement booking = driver.findElement(By.cssSelector("#gnb"));
		
		booking.click();
		booking.click();
		
		WebElement bookingDetail = driver.findElement(By.cssSelector("#wrap > div.header.header-e > div.gnb_wrap > div > ul > li:nth-child(1) > ul > li:nth-child(2) > a"));
		
		bookingDetail.click();
		
		WebElement departure = driver.findElement(By.cssSelector("#dptRsStnCdNm"));
		
		departure.clear();
		departure.sendKeys("대전");
		
		WebElement arrival = driver.findElement(By.cssSelector("#arvRsStnCdNm"));
		
		arrival.clear();
		arrival.sendKeys("부산");
		
		Select january22nd = new Select(driver.findElement(By.name("dptDt")));
		
        // 구현한 날 기준
        // 매진일 경우
		january22nd.selectByValue("20230121");
        // 일반실일 경우
//		january22nd.selectByValue("20230122");
		// 특실일 경우
//		january22nd.selectByValue("20230123");
		
		WebElement confirmBooking = driver.findElement(By.cssSelector("#search_top_tag > input"));
		
		confirmBooking.click();
		
		Thread.sleep(1000);
	
		String bookingUrl = driver.getCurrentUrl();
		
		Loop1:
		while (true) {
			List<WebElement> canBook = driver.findElements(By.cssSelector("#result-form > fieldset > div.tbl_wrap.th_thead > table > tbody > tr td a span"));
			for (WebElement span: canBook) {
				if (span.getText().equals("예약하기")) {
					span.click();
					break Loop1;
				}
			}
			
			driver.navigate().refresh();
			Thread.sleep(500);
		}
		
		if (driver.getCurrentUrl().equals(bookingUrl)) {
			WebElement mola = driver.findElement(By.cssSelector("body > div.swal2-container.swal2-center.swal2-backdrop-show > div > div.swal2-actions > button.swal2-confirm.swal2-styled.swal2-default-outline"));

			mola.click();
		}
		
		WebElement payBooking = driver.findElement(By.cssSelector(".btn_large"));
		
		payBooking.click();
		
		Thread.sleep(1000);
		
		WebElement bemillgetaway = driver.findElement(By.cssSelector("#stlCrCrdNo14_tk_btn > label"));
		
		bemillgetaway.click();
		
		WebElement card1 = driver.findElement(By.cssSelector("#stlCrCrdNo11"));
		WebElement card2 = driver.findElement(By.cssSelector("#stlCrCrdNo12"));
		WebElement card3 = driver.findElement(By.cssSelector("#stlCrCrdNo13"));
		WebElement card4 = driver.findElement(By.cssSelector("#stlCrCrdNo14"));
		
		card1.sendKeys("1234");
		card2.sendKeys("1234");
		card3.sendKeys("1234");
		card4.sendKeys("1234");
		
		Select month = new Select(driver.findElement(By.name("crdVlidTrm1M")));
		Select year = new Select(driver.findElement(By.name("crdVlidTrm1Y")));
		
		month.selectByValue("12");
		year.selectByValue("23");
		
		WebElement paymentPassword = driver.findElement(By.cssSelector("#vanPwd1"));
		
		paymentPassword.click();
		
		WebElement num = driver.findElement(By.cssSelector("#vanPwd1_mainDiv > div:nth-child(4) > div"));
		num.click();
		num.click();
		
		WebElement bemill = driver.findElement(By.cssSelector("#athnVal1"));
		
		bemill.sendKeys("961202");
		WebElement theEnd = driver.findElement(By.cssSelector("#requestIssue1 > span"));
		theEnd.click();
		
		driver.switchTo().alert().accept();
	}

}

Trouble-Shooting

다른 팀의 프로그램을 보다가 오류를 보았다. 어떤 버튼을 클릭할 때 type에 따라 .click()이 있고 .submit()이 있고 따로 처리를 해줘야하지만 모든 버튼을 .click()으로 처리를 하려니 에러가 난 것이었다.

예를 들어 <input type="submit" ...>일 경우 .submit()으로 처리를 해주는 것이 정석인 것이다.

profile
응애 난 애기 개발자

0개의 댓글