Python3之selenium實踐道雲配置修改自動化程式碼實現

Quincy379發表於2020-10-26
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time
import re
browser = webdriver.Chrome()
# 程式碼不起作用需要找到與瀏覽器對應的chromedriver版本
browser.maximize_window()
browser.get("https://xx.xx.xx.xx/login.html")



browser.find_element_by_css_selector('#login > div.login-page > div.perspective-box > div > div > div:nth-child(1) > div > div > div > div.dao-popover-rel > input[type="text"]').send_keys("")
browser.find_element_by_css_selector('#login > div.login-page > div.perspective-box > div > div > div:nth-child(2) > label > div > div > div > div.dao-popover-rel > input[type="password"]').send_keys("")
time.sleep(5) 
browser.find_element_by_css_selector('#app > div.layout > menu > div.menu-panel > div > section:nth-child(4) > menu:nth-child(6) > span > span.name').click() 
browser.find_element_by_css_selector('#app > div.layout > menu > div.menu-panel > div > section:nth-child(4) > menu:nth-child(6) > ul > li:nth-child(1) > span > span.name').click() 
browser.find_element_by_css_selector('#app > div.global-navigator-container > nav > div.nav-center-container > div > a > span.caret-select').click() 
#time.sleep(1)
browser.find_element_by_css_selector('#app > div.global-navigator-container > nav > div.nav-center-container > div > ul > li:nth-child(12) > span').click() 
time.sleep(3)
tbody = browser.find_element_by_xpath('//*[@id="app"]/div[3]/div/div/div[1]/div[2]/div[1]/table/tbody')
alinks = tbody.find_elements_by_tag_name("a")

for x in range(len(alinks)):
	time.sleep(5)
	tbody = browser.find_element_by_xpath('//*[@id="app"]/div[3]/div/div/div[1]/div[2]/div[1]/table/tbody')
	
	now_handle_tab = browser.current_window_handle
	tbody.find_elements_by_tag_name("a")[x].click()
	
	
	time.sleep(1)
	trss = browser.find_elements_by_xpath('//*[@id="app"]/div[3]/div/div/div[2]/div[2]/div/div[3]/div/div[2]/div[1]/table/tbody')
	for tt in trss:
		# 備份
		if "APP_OPTS" in tt.text:
			with open("eruka.json","w") as f:
			    f.write(tt.text)
			browser.find_element_by_xpath('//*[@id="app"]/div[3]/div/div/div[2]/div[2]/div/div[3]/div/div[2]/div[2]/button/span[1]').click()
			
			
			app_ops_text = browser.execute_script('return document.getElementsByTagName("textarea")[0].value')
			# 獲取舊配置,修改密碼
			result = re.sub("direwolf:direwolf",":",app_ops_text)
			
			browser.find_element_by_xpath('//*[@id="app"]/div[3]/div/div/div[3]/div[1]/div[2]/div[2]/div/div/div/div/div/div[2]/div/div/div[4]/textarea').clear()
			time.sleep(3)
			txtcontent = 'var ta = document.getElementsByTagName("textarea")[0];ta.value="'+result+'";'
			#print(txtcontent)
			#browser.execute_script('var ta = document.getElementsByTagName("textarea")[0];ta.value="--server.port=50339";')
			browser.find_element_by_xpath('//*[@id="app"]/div[3]/div/div/div[3]/div[1]/div[2]/div[2]/div/div/div/div/div/div[2]/div/div/div[4]/textarea').send_keys(result)
			browser.find_element_by_xpath('//*[@id="app"]/div[3]/div/div/div[3]/div[1]/div[2]/div[3]/div/button[1]').click()
			browser.back()
		else:
			browser.back()
		
	
browser.close()

編寫程式碼時遇到的幾個問題:

  1. chrome瀏覽器無法全屏,browser.maximize_window()不起作用,需要找到與瀏覽器對應的chromedriver對應版本
  2. textarea內容的填入與獲取,需要結合js和selenium同時進行比較好,解決方案具體看程式碼
  3. 迴圈處理元素點選事件時如果有時可以有時只能獲取一個元素,說明瀏覽器元素尚未載入完畢就被selenium獲取進而只能拿到1-2個元素進行迴圈,所以需要使用wait.until()或者多睡幾秒,等元素載入完全

selenium最大的缺點就是效率太低,平時用來做個測試還行,真要大規模採集資料需要另尋出路,當然還要處理反爬等技術

相關文章