Selenium

[Selenium] 뮤트하기

MASSO 2023. 1. 8. 19:28
728x90

문득.. 트우l터 계정의 뮤트 키워드가 자동으로 등록됐으면 좋겠다는 생각이 들었다....
 

import selenium
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
import pyperclip

driver = webdriver.Chrome()
driver.maximize_window()
url = "https://twitter.com/"
driver.get(url)
time.sleep(4)

driver.find_element(By.XPATH,'//*[@id="layers"]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div[1]/a').click()
time.sleep(2)

twid = "트위터 아이디"
pyperclip.copy(twid)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[5]/label/div/div[2]/div/input').send_keys(Keys.CONTROL + 'v')
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[6]').click()
time.sleep(1)

#twnn = "트위터 닉네임"
#pyperclip.copy(twnn)
#driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div[2]/label/div/div[2]/div/input').send_keys(Keys.CONTROL + 'v')
#time.sleep(1)
#driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[2]/div/div/div/div').click()
#time.sleep(1)

twpw = "트위터 비밀번호"
pyperclip.copy(twpw)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div/div[3]/div/label/div/div[2]/div[1]/input').send_keys(Keys.CONTROL + 'v')
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[2]/div/div[1]/div/div/div').click()
time.sleep(5)

driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[1]/div[1]/div/div/div/div/div/div[2]/div').click()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div[2]/div/div[3]/div/div/div/a').click()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[1]/div[2]/div[2]/div[3]/a').click()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div/a[4]').click()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/a[3]').click()
time.sleep(1)

driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[1]/div/div/div/div/div[3]/a').click()
time.sleep(1)

driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div[1]/div[1]/label/div/div[2]/div/input').send_keys("뮤트")
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div[1]/div[2]/div[4]/div/div/div/div/div/label[1]/div/div[2]/input').click()
time.sleep(1)

driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div[3]/div').click()
time.sleep(2)

aria-expanded가 "false"/"true"값으로 들어오는 버튼 누르는 방법을 찾지 못 하여.. 다른 버튼을 이용하여 진입했다.
로그인 뒤 뮤트 메뉴 진입 > 키워드 입력 후 저장하는 방식이다.
* 주석 처리한 부분은 계속 돌릴 경우 비정상 로그인을 감지하여 계정 닉네임이나 전화번호를 입력하라고 나오는데, 그게 나왔을 경우를 대비한 부분이다. 일단 처음 하면 안 나올 테니 주석 처리해놨는데 나오는 경우에만 돌아가도록 예외처리를 하면 좋을 듯?
 

그리고 해당 코드로 추가되는 뮤트 키워드의 설정은 위와 같다.
driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div[1]/div[2]/div[4]/div/div/div/div/div/label[1]/div/div[2]/input').click()
요 부분이 위에 표시한 부분을 선택하기 위함이다.
초기에는 [내가 팔로우하지 않는 사람들]로 되어 있기 때문! 설정을 바꾸고 싶다면 수정해서 사용하면 될 듯하다.
 

아무튼 돌려보면 이렇게 "뮤트" 키워드가 뮤트된다.
뮤트할 단어는 driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div[1]/div[1]/label/div/div[2]/div/input').send_keys("뮤트")의 "뮤트" 부분을 바꿔주면 된다.
 
가능하다면 여러가지 단어를 한꺼번에 등록하고 싶어서 리스트와 while문을 추가로 넣어봤다.

import selenium
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
import time
import pyperclip

driver = webdriver.Chrome()
driver.maximize_window()
url = "https://twitter.com/"
driver.get(url)
time.sleep(4)

driver.find_element(By.XPATH,'//*[@id="layers"]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div[1]/a').click()
time.sleep(2)

twid = "아이디"
pyperclip.copy(twid)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[5]/label/div/div[2]/div/input').send_keys(Keys.CONTROL + 'v')
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[6]').click()
time.sleep(1)

twnn = "닉네임"
pyperclip.copy(twnn)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div[2]/label/div/div[2]/div/input').send_keys(Keys.CONTROL + 'v')
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[2]/div/div/div/div').click()
time.sleep(1)

twpw = "비밀번호"
pyperclip.copy(twpw)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div/div[3]/div/label/div/div[2]/div[1]/input').send_keys(Keys.CONTROL + 'v')
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[2]/div/div[1]/div/div/div').click()
time.sleep(5)

driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[1]/div[1]/div/div/div/div/div/div[2]/div').click()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div[2]/div/div[3]/div/div/div/a').click()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[1]/div[2]/div[2]/div[3]/a').click()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div/a[4]').click()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/a[3]').click()
time.sleep(1)

mute = ["뮤트1","뮤트2","뮤트3","뮤트4"]
mutegaesu = 0
while mutegaesu < len(mute):
    driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[1]/div/div/div/div/div[3]/a').click()
    time.sleep(2)
    
    driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div[1]/div[1]/label/div/div[2]/div/input').send_keys(mute[mutegaesu])
    time.sleep(1)

    driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div[1]/div[2]/div[4]/div/div/div/div/div/label[1]/div/div[2]/input').click()
    time.sleep(1)

    driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div[3]/div').click()
    time.sleep(2)
    
    mutegaesu += 1

mute라는 리스트를 만들어 ["뮤트1","뮤트2","뮤트3","뮤트4"]를 넣어주고 mutegaesu라는 변수(초기값)를 만들어 0을 넣어주었다.
그리고 mutegaesu가 mute 리스트 내 value의 총 개수보다 작은 동안은 계속 while 속 구문이 돌도록 while문을 작성해주었다. 이 while문은 한 번 돌 때마다 mutegaesu의 수를 1씩 증가시킬 것이다.
while속 send_keys(mute[mutegaesu]) 속 mutegaesu의 수도 함께 변경되는 것이므로 처음엔 mute[0] 즉, 0번 자리에 있는 "뮤트1"이라는 값이 입력될 것이고 그 후 "뮤트2","뮤트3"...순으로 등록될 것이다.
 

결과적으로 이렇게 뮤트 키워드가 자동 등록되는 것을 볼 수 있다.
다른 키워드를 뮤트하고 싶다면 리스트 속 값만 수정해주면 된다.
 

import selenium
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
import time
import pyperclip

driver = webdriver.Chrome()
driver.maximize_window()
url = "https://twitter.com/"
driver.get(url)
time.sleep(4)

driver.find_element(By.XPATH,'//*[@id="layers"]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div[1]/a').click()
time.sleep(2)

twid = "이메일 또는 아이디"
pyperclip.copy(twid)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[5]/label/div/div[2]/div/input').send_keys(Keys.CONTROL + 'v')
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[6]').click()
time.sleep(1)

try:
    twnn = "아이디"
    pyperclip.copy(twnn)
    driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div[2]/label/div/div[2]/div/input').send_keys(Keys.CONTROL + 'v')
    time.sleep(1)
    driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[2]/div/div/div/div').click()
    time.sleep(1)

except:
    pass

twpw = "비밀번호"
pyperclip.copy(twpw)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div/div[3]/div/label/div/div[2]/div[1]/input').send_keys(Keys.CONTROL + 'v')
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[2]/div/div[1]/div/div/div').click()
time.sleep(5)

driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[1]/div[1]/div/div/div/div/div/div[2]/div').click()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div[2]/div/div[3]/div/div/div/a').click()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[1]/div[2]/div/div[3]/a').click()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div/a[4]').click()
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/a[3]').click()
time.sleep(1)

try:
    driver.find_element(By.XPATH,'//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div[2]/div/div[2]/div[2]/div').click()
    time.sleep(1)
    
except:
    pass

mute = ["뮤트1","뮤트2","뮤트3","뮤트4"]
mutegaesu = 0
while mutegaesu < len(mute):
    driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[1]/div/div/div/div/div[3]/a').click()
    time.sleep(2)
    
    driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div[1]/div[1]/label/div/div[2]/div/input').send_keys(mute[mutegaesu])
    time.sleep(1)

    driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div[1]/div[2]/div[4]/div/div/div/div/div/label[1]/div/div[2]/input').click()
    time.sleep(1)

    driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/section[2]/div[2]/div[3]/div').click()
    time.sleep(2)
    
    mutegaesu += 1

수정 완료~ try, expect를 이용하여 예외처리를 줬다.
try 구문이 안 나와도 바로 아래로 넘어갈 수 있도록 expect에는 pass만 넣었다.
try 구문이 나오지 않는 다른 계정으로도 테스트 완료 ~_~

728x90

'Selenium' 카테고리의 다른 글

[Selenium] 실험1  (0) 2023.09.09
[Selenium] 크롬 창 종료 현상?  (0) 2023.06.16
[Selenium] 엑셀 파일 읽기/쓰기  (0) 2023.01.21
[Selenium] 값 비교  (0) 2023.01.05
[Selenium] 타이틀 비교  (0) 2023.01.04