이전편까지의 셀레니움기능들로 대부분의 간단한 매크로를 만들 수 있습니다.

게시글 제목만 가져오기, 특정기간내의 게시글 가져오기, 여러계정들의 정보바꾸기 등등

 

하지만 다음 페이지로 넘어가고 페이지 로딩이 되지도 않았는데 프로그램은 페이지가 로딩 안된지 몰라서 다음 단계로 진행할 수 있습니다. 

 


웹 로딩 대기

1.

_driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);

해당코드는 페이지로딩까지 최대 10초까지 기다린다는 뜻 입니다

10초내로 페이지로딩이 완료되면 다음 작업을 진행하고 10초가 넘어가면 더이상 기다리지않고 다음 작업을 진행하게됩니다

한번만 설정하면 모든 드라이버에서 적용됩니다

원하는 '초'단위의 숫자를 입력하시면 됩니다


2.

WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(10));
IWebElement SearchResult = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementExists(By.XPath(xpath)));

10초동안 xpath요소가 존재할때까지 대기한다는 뜻입니다

여기서 특별한 셀레니움기능이 추가되는데

해당 패키지를 먼저 설치하셔야 합니다


3.

Thread.Sleep(1000);

특정 상황에서는 페이지로딩을 기다려도 특정한 이유로 더 기다려야하는 상황이 생길 수 있습니다

이럴 땐 강제로 슬립을 걸어서 기다리는 방법이 있습니다.

ms단위 이므로 1초를 기다리려면 위의 코드처럼 1000으로 입력해야합니다

 


자바스크립트

IJavaScriptExecutor _js = (IJavaScriptExecutor)_driver;
_js.ExecuteScript(js);

이건 별거 없고 이렇게 바로 실행해주시면 됩니다

 

https://github.com/ForestBird1/TestSelenium.git

 

GitHub - ForestBird1/TestSelenium

Contribute to ForestBird1/TestSelenium development by creating an account on GitHub.

github.com

 


쓰기, 읽기, 지우기

이전의 3번게시글을 읽어서 XPath값을 가져오는 방법으로 아이디텍스트박스의 XPath값을 가져옵니다

private IWebElement _web_elem = null;

//쓰기
_web_elem = _driver.FindElement(By.XPath("//*[@id='id']"));
_web_elem.SendKeys("id");

//읽기
_web_elem = _driver.FindElement(By.XPath("//*[@id='id']"));
Console.WriteLine(_web_elem.Text);

//지우기
_web_elem = _driver.FindElement(By.XPath("//*[@id='id']"));
//둘중에 하나만 사용해도 됩니다
_web_elem.SendKeys("");
_web_elem.Clear();

꼭 XPath의 큰따옴표를 작은따옴표로 바꿔주셔야합니다!


이제 기본적인 매크로를 만들 수 있습니다

우리는 특정한 요소의 내용을 가져올 수 있고 텍스트박스에 입력할 수 있으며 클릭을통해 모든 행동을 제어할 수 있습니다.

아직 고급단계가 남아있긴하지만 어지간한 매크로를 만드는데는 충분합니다. 

물론 아직 완벽하게 만들기는 무리가 있습니다. 자바스크립트도 사용못하고 쓰레드슬립도 모르고 웹로딩을 대기하는 방법도 모릅니다. 특별히 스크린샷기능도 모르죠

다음 포스팅엔 조금더 고급단계로 넘어가보겠습니다

 

https://github.com/ForestBird1/TestSelenium.git

 

GitHub - ForestBird1/TestSelenium

Contribute to ForestBird1/TestSelenium development by creating an account on GitHub.

github.com

 


XPath?

'특정한 요소, 속성의 경로' 입니다

직접 네이버로그인을 셀레니움으로 해보며 알아봅시다

 


XPath가져오기

우리가 클릭하고 입력해야할 버튼과 텍스트박스

먼저 로그인을 하기 위해 사진의 로그인버튼을 눌러야 합니다

어 그런데 우리는 마우스커서를 버튼에 올려서 클릭만 하면 되었는데 '로그인버튼'을 어떻게 코드로 작성할지 아리송하시죠? 그럴때 필요한게 바로 로그인버튼의 경로를 알려주는 XPath를 이용하면됩니다

 

발퀄 ㅈㅅ..

성격상 각잡고 하려면 시작조차 안해서 대충이라도 올리려고 그림판으로 대충 표시만 했습니다.. 양해부탁...

아무튼 브라우저에서 F12를 누르면 개발자도구창이 나옵니다

우상단에 빨갛게 동그라미로 표시한 버튼을 누른뒤 웹에서 XPath를 얻고자하는 요소를 누릅니다

 

그러면 개발자 도구창에 파랗게 선택이 되는데 이것이 클릭한 요소입니다.

우리는 XPath값을 얻어야하므로 우클릭->Copy->Copy XPath를 눌러서 XPath값을 얻을 수 있습니다!!

컨트롤V하면 XPath를 볼 수 있는데

//XPath원본
//*[@id="account"]/a

//꼭 큰따옴표를 작은따옴표로 변경해야합니다
//*[@id='account']/a

이렇게 표시되는것을 알 수있습니다. 꼭 따옴표를 변경하세요!!

 

여기서 full XPath가 무엇인지 궁금해하실 수 있는데

XPath는 요소의 '상대경로'

full XPath는 '절대경로' 입니다

가끔 XPath로 작동이 되지 않는 웹이 있는데 이럴땐 fullXPath로 작동하면 대부분 잘 됩니다

 

자 이제 XPath를 가져올 수 있으니 클릭을 해봅시다


클릭

먼저 네이버URL로 이동합시다

//브라우저 생성
_driver = new ChromeDriver(_driverService, _options);
_driver.Navigate().GoToUrl("https://www.naver.com/");

아주 간단하죠? 브라우저 생성후 이동하면 됩니다

 

클릭코드는 아래와 같습니다

private void btn_click_loginpage_Click(object sender, EventArgs e)
{
    try
    {
        //요소를 찾습니다
        _web_elem = _driver.FindElement(By.XPath("//*[@id='account']/a"));
        //클릭합니다
        _web_elem.Click();
    }
    catch(NoSuchElementException exception)
    {
        //요소가 없습니다
    }
}

정말 간단하죠? 만약 요소를 찾을 수 없다면 catch문으로 빠져나옵니다

 

다음 포스트에서는 페이지로딩대기, 아이디와 비밀번호입력까지 진행하겠습니다

 

https://github.com/ForestBird1/TestSelenium.git

 

GitHub - ForestBird1/TestSelenium

Contribute to ForestBird1/TestSelenium development by creating an account on GitHub.

github.com

 

+ Recent posts