오늘은 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();
}
}
다른 팀의 프로그램을 보다가 오류를 보았다. 어떤 버튼을 클릭할 때 type에 따라 .click()이 있고 .submit()이 있고 따로 처리를 해줘야하지만 모든 버튼을 .click()으로 처리를 하려니 에러가 난 것이었다.
예를 들어 <input type="submit" ...>
일 경우 .submit()으로 처리를 해주는 것이 정석인 것이다.