org.openqa.selenium.NoSuchElementException : no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="container"]/section/article[2]/div[1]/header/div/h3/span[2]"}
처리 중에 명령 무시
따라서 로그인 명령을 내린 후 처리될 시간을 줘야함
WebDriverWait wait = new WebDriverWait(driver,10); // 10초
wait.until(ExpectedConditions.urlToBe("https://www.daum.net/")); //명시적 대기
// 가져올 데이터가 로딩될 때까지 기다림
webDriverWait.until(
ExpectedConditions.presenceOfElementLocated(By.cssSelector("div._fnctWrap > form:nth-child(2) > div > table > tbody > tr"))
);
// 명시적 대기 ( 해당 요소가 나타날 때까지 대기 )
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#account > a")));
driver.findElement(By.cssSelector("#account > a")).click(); // #account > a 요소를 찾아서 클릭
Thread.sleep(5000); //묵시적 대기. 5초
public class SeleniumEx {
public static void main(String[] args) throws Exception {
String url = "https://www.dcinside.com/";
WebDriver driver = new ChromeDriver(chromeOptions);
driver.get(url);
Thread.sleep(1000);
driver.findElement(By.xpath("//*[@id=\"container\"]/div/section[1]/article[1]/div[3]/ul[1]/li[1]/a/div[2]/p")).click();
Thread.sleep(1000);
}
우리는 명령어로 셀레니움을 조작한다.
예를 들어 driver.get(‘https://pythondocs.net’) 이라고 치면 파이썬은 셀레니움을 신호를 보내고 셀레니움은 브라우저에 url 을 이동하라고 신호를 보낸다.
브라우저는 pythondocs 서버로 웹페이지를 보여달라는 신호를 보내고 pythondocs.net 은 신호를 받고 html, css, 자바스크립트라는 언어로 된 웹페이지 정보를 나의 브라우저로 보내준다.
나의 브라우저는 수신한 언어를 사람들의 눈에 보기 좋은 화면으로 변환(render, 렌더)해서 브라우저 화면으로 보여준다.
자 그럼 당연히 시간 차라는 것이 생기게 된다.
driver.get(‘https://pythondocs.net’) 명령어를 쓰자마자 서버로부터 데이터를 받아오기도 전에 브라우저 화면에 있는 것을 어떻게 하라는 그 다음 명령어가 실행되면 컴퓨터는 당연히 에러 내거나 올바르게 코드가 작동하지 않는다.
기다려야 한다!