defaultK

[JAVA] Selenium 네이버 블로그 서로이웃추가 자동화 프로그램 본문

Selenium

[JAVA] Selenium 네이버 블로그 서로이웃추가 자동화 프로그램

kwoss2341 2022. 6. 19. 11:53

네이버 블로그 서로이웃추가 자동화 프로그램을 만들어보자.

 

먼저 개발환경을 세팅하는 방법은 여기서...

https://kwonik2304.tistory.com/52

 

[JAVA] Selenium - 개발 환경 세팅

1. pom.xml 추가 (최신버전: 4.1.4 추가. 해당 링크에서 원하는 버전 조회하여 추가) org.seleniumhq.selenium selenium-java 4.1.4 2. 크롬 드라이버 다운로드 https://chromedriver.chromium.org/downloads Chro..

kwonik2304.tistory.com

 

우선 Selenium 을 이용하기에 앞서 웹 분석이 필요하다.

분석은 크게 프로그램 동작과  동작에 필요한 각각의 요소에 대한 분석이 필요하다.

 

동작은 사용자의 event ( click, input, wait, get 등) 

웹 요소분석은 event가 이루어질 웹 요소를 분석한다.

 

해당 코드는 네이버 로딩 후

로그인 클릭 후

일정시간동안 사용자가 로그인하기를 대기한 후 블로그 페이지 까지 이동하는 코드이다.

 

String url = "https://www.naver.com/";

//1. 네이버 페이지 로딩
driver.get(url);
Thread.sleep(delay);

//2. 로그인 클릭
element = driver.findElement(By.cssSelector("#account > a"));
element.click();
Thread.sleep(delay*4);

//3. 블로그 페이지 이동
driver.get("https://section.blog.naver.com/BlogHome.naver?directoryNo=0&currentPage=1&groupId=0");
Thread.sleep(delay);

 

여기서 click 이벤트를 수행하는 요소를 찾기 위해서 css 선택자를 이용한 모습을 볼 수 있다.

요소를 찾기위한 방법은 xpath, css selector, id, class name 등 많은 방법이 있다.

해당 요소를 개발자 모드를 이용하여 분석한 후 가장 적합한 방법을 이용하면 된다.

 

 

 

 

블로그 페이지로 이동했다면 이웃추가 버튼을 클릭하여 서로이웃추가 하는 작업을 수행한다.

 

 

하지만 여기서 반복 수행에 대한 문제가 생긴다...

 

1.  해당 페이지 내의 모든글에 대해 이웃추가 버튼을 클릭 반복 수행.

2.  1번 반복 완료 후 하단 1~10페이지 클릭 반복수행

3.  2번 반복 완료 후 다음버튼 클릭 

 

 

반복을 위해서는 해당 요소를 찾아 그 요소만큼 반복적으로 수행해야 한다.

그러기 위해서는 ChromeDriver 의 findElements 메소드를 이용하여 공통된 특징을 가진 요소드를 찾은 후 반복한다.


List<WebElement> pageButtons = driver.findElements(By.cssSelector("#content > section > div:nth-child(3) > div > span > a")) ;
for(int i=1; i<10; i++)
{
	getList(driver);
	element=pageButtons.get(i);
	element.click();
	Thread.sleep(delay);
}
	
element = driver.findElement(By.cssSelector("#content > section > div:nth-child(3) > div > a"));
element.click();
Thread.sleep(delay);

 

 

이러한 방식으로 반복적으로 서로이웃신청이 가능하다.

하지만 실제 이웃추가 버튼을 클릭하게 되면....

 

이러한 팝업창이 나온다..

해당 팝업창에서 driver 동작이 이루어 져야한다.

그러기 위해서 driver의 switchTo 메소드를 이용하여 해당 팝업으로 전환 후

동작들이 이루어 져야한다.

 

static void clickAddNeighbor(ChromeDriver driver) throws InterruptedException
	{
		String MainWindow = driver.getWindowHandle();
		Set<String> s1= driver.getWindowHandles();
		Iterator<String> i1= s1.iterator();
		
		while(i1.hasNext()){
			String ChildWindow = i1.next();
			
			if(!MainWindow.equalsIgnoreCase(ChildWindow)){
				driver.switchTo().window(ChildWindow);
				//팝업창에서의 동작 구현...
			}
		}
		
		
		driver.switchTo().window(MainWindow);

		
	}

 

코드와 같이 MainWindow 를 저장 후 하위 window로 이동하여 동작을 수행하면 된다.

동작이 끝나면 다시 MainWindow 로 돌아와서 이웃추가를 반복 수행하여야 한다.

 

 

해당 작업을 수행하는 전체 코드이다.

public class SeleniumMain {

	public static String WEB_DRIVER_ID = "webdriver.chrome.driver";
	public static String WEB_DRIVER_PATH = "chromedriver.exe";
	public static int delay = 3;
	public static WebElement element;
	

	public static void main(String[] args) throws InterruptedException, IOException {
		
		
		// TODO Auto-generated method stub
		System.setProperty(WEB_DRIVER_ID, WEB_DRIVER_PATH);
		
		
		ChromeOptions options = new ChromeOptions();
		options.addArguments("--disable-popup-blocking");
		options.addArguments("--start-maximized");
		options.addArguments("--window-size=1920,1080");
		
		ChromeDriver driver = new ChromeDriver(options);
		
		try {
			start(driver);
			
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally{
			driver.quit();
		}
		
		
		
		
		
		
		
		

	}
	
	
	
	static void start(ChromeDriver driver) throws InterruptedException
	{
		String url = "https://www.naver.com/";
		
		
		driver.get(url);
		Thread.sleep(delay);
	
		element = driver.findElement(By.cssSelector("#account > a"));
		element.click();
		Thread.sleep(delay*4);

		
		driver.get("https://section.blog.naver.com/BlogHome.naver?directoryNo=0&currentPage=1&groupId=0");
		Thread.sleep(delay);
		
		
		
		
		while(true)
		{
			List<WebElement> pageButtons = driver.findElements(By.cssSelector("#content > section > div:nth-child(3) > div > span > a")) ;
			for(int i=1; i<10; i++)
			{
				getList(driver);
				element=pageButtons.get(i);
				element.click();
				Thread.sleep(delay);
			}
			
			element = driver.findElement(By.cssSelector("#content > section > div:nth-child(3) > div > a"));
			element.click();
			Thread.sleep(delay);
		}
		
		
		

		
		
	}
	
	static void getList(ChromeDriver driver) throws InterruptedException
	{
		WebElement element;
		
		//목록찾기
		List<WebElement> elements = driver.findElements(By.cssSelector("a.button_buddy.button_buddy_add"));
		Thread.sleep(delay);
		
		for(WebElement el : elements)
		{
			el.click();
			Thread.sleep(delay);
			
			clickAddNeighbor(driver);
			Thread.sleep(delay);
		}

	}

	
	
	static void clickAddNeighbor(ChromeDriver driver) throws InterruptedException
	{
		String MainWindow = driver.getWindowHandle();
		Set<String> s1= driver.getWindowHandles();
		Iterator<String> i1= s1.iterator();
		
		while(i1.hasNext()){
			String ChildWindow = i1.next();
			
			if(!MainWindow.equalsIgnoreCase(ChildWindow)){
				driver.switchTo().window(ChildWindow);
				String name=null;
				try {
					element = driver.findElement(By.cssSelector("#content > div > form > fieldset > div.popup_text > div.buddy_state > p.text_buddy_add > strong"));
					name=element.getAttribute("innerHTML");
					
					element = driver.findElement(By.cssSelector("#content > div > form > fieldset > div.popup_text > div.buddy_state > p > span.wrap_radio.radio_bothbuddy > label"));
					element.click();
					Thread.sleep(delay);
					
					element = driver.findElement(By.cssSelector("#content > div > form > fieldset > div.area_button > a.button_next._buddyAddNext"));
					element.click();
					Thread.sleep(delay);
					
					element = driver.findElement(By.cssSelector("#message"));
					if(name!=null)
					{
						element.sendKeys(name+"님! 글 재밌게봤습니다^^ 서로이웃 추가 해요 ㅎㅎ");
					}
					else
					{
						element.sendKeys("글 재밌게봤습니다^^ 서로이웃 추가 해요 ㅎㅎ");
					}
					Thread.sleep(delay);
					
					
					element = driver.findElement(By.cssSelector("body > form > div > div > fieldset > div.area_button > a.button_next._addBothBuddy"));
					element.click();
					Thread.sleep(delay);
					
					System.out.println("["+name+"] 서로이웃추가 신청완료");
					driver.close();
				}
				catch(UnhandledAlertException e)
				{
					System.out.println("["+name+"] 이미 서로이웃추가신청된 계정.");
				}
				catch(Exception e)
				{
					System.out.println("["+name+"] 서로이웃추가 비활성 계정");	
					driver.close();
				}
				finally
				{
					
				}

				
				
			}
		}
		
		
		driver.switchTo().window(MainWindow);

		
	}
}

 

'Selenium' 카테고리의 다른 글

[JAVA] Selenium - 개발 환경 세팅  (0) 2022.05.01
Comments