Python3之selenium实践道云配置修改自动化代码实现

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()或者多睡几秒,等元素加载完全
  4. 代码的优化方面,比如time.sleep(5)改成wait.until等

selenium最大的缺点就是效率太低,平时用来做个测试还行,真要大规模采集数据需要另寻出路,当然还要处理反爬等技术

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页