浏览器自动化 - 全流程代码示例
如果对xpath有疑问,可以看前面文章介绍,如果获取xpath。简单来讲,打开浏览器开发者模式,右键元素,复制xpath即可。
- 获取driver
- 登录与验证
- <iframe>标签的切换
- 输入文本
- 下拉选项选择
- 点击查询按钮
- 截屏保存
- 清除cookies退出浏览器
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from pathlib import Path
urls = {
'login': 'https://***.***.***.***'
}
login_info = {
'username': '***',
'password': '***'
}
project_name = '***'
def get_driver():
# chromedriver是当前路径,已经下载好的chrome驱动。
chromedriver = 'chromedriver'
# 配置对象
options = webdriver.ChromeOptions()
# 取消用户名密码保存的浏览器提示
prefs = {"profile.password_manager_enabled": False, "credentials_enable_service": False}
# 取消用户名密码保存的浏览器提示
options.add_experimental_option("prefs", prefs)
# 隐藏“Chrome正受到自动测试软件的控制。”
options.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(executable_path=chromedriver, options=options)
# 隐式等0.5秒
driver.implicitly_wait(0.5)
driver.maximize_window()
return driver
def login(driver):
# 自动登录UC
driver.get(urls['login'])
# 定位用户名输入框
username = driver.find_element(By.NAME, value='tbxUserName')
# 清空输入框的内容
username.clear()
# 输入用户名
username.send_keys(login_info['username'])
# 定位密码输入框
password = driver.find_element(By.NAME, value='tbxPassword')
# 输入密码
password.send_keys(login_info['password'])
# 如果有验证码,可以使用下面方法
# captcha_xpath = ''
# wait_xpath(driver, captcha_xpath)
# captcha = driver.find_element(By.XPATH, value=captcha_xpath)
# code = input('验证码:')
# captcha.send_keys(code)
# 在浏览器开发者工具模式下,可以通过找到你想要操作的元素(登录按钮),然后选择复制--> XPath。
login_xpath = '//*[@id="btnLogin"]'
driver.find_element(By.XPATH, value=login_xpath).click()
pop_close_xpath = '//*[@id="form1"]/div[3]/div[1]/span'
wait_xpath(driver, pop_close_xpath)
driver.find_element(By.XPATH, value=pop_close_xpath).click()
time.sleep(1)
def display_all_project(driver):
# 切入<iframe>标签
navi_pane_id = 'left_frame'
driver.switch_to.frame(driver.find_element(By.ID, value=navi_pane_id))
project_mgt = '//*[@id="dd0"]/div[7]/a[2]'
driver.find_element(By.XPATH, value=project_mgt).click()
query_all_projects = '//*[@id="sd31"]'
driver.find_element(By.XPATH, value=query_all_projects).click()
def input_project_name(driver, project_name):
# 回到主<iframe>标签
driver.switch_to.parent_frame()
content_frame_id = 'right_frame'
driver.switch_to.frame(driver.find_element(By.ID, value=content_frame_id))
project_input = '//*[@id="txtProjectName"]'
driver.find_element(By.XPATH, value=project_input).send_keys(project_name)
def select_option(driver):
# 选择下拉框
mark_xpath = '//*[@id="dropStage_txtMain"]'
mark = driver.find_element(By.XPATH, value=mark_xpath)
# 将鼠标指针移动到mark元素上,执行单击操作
ActionChains(driver).move_to_element(mark).click(mark).perform()
# 下拉框中的选项位置
mark_index_xpath = '//*[@id="dropStage_chkItemText0"]'
mark_index = driver.find_element(By.XPATH, value=mark_index_xpath)
# 选择下拉框中的选项
ActionChains(driver).move_to_element(mark_index).click(mark_index).perform()
def click_query(driver):
query_button = '//*[@id="btnSearch"]'
driver.find_element(By.XPATH, value=query_button).click()
def screenshot(driver):
# 保存截图
dir = Path('screenshot')
if not dir.is_dir():
dir.mkdir(parents=True)
now = str(int(time.time()))
imgpath = dir.joinpath(f'{now}.png')
driver.save_screenshot(str(imgpath))
def clear(driver):
# 清空所有Cookie
driver.delete_all_cookies()
# 退出浏览器
driver.quit()
def wait_xpath(driver, xpath):
try:
# 显示等待10s,每秒判断元素是否加载完成
WebDriverWait(driver, 15, 1).until(
lambda x: x.find_element(By.XPATH, value=xpath)
)
except Exception as e:
raise e
if __name__ == '__main__':
driver = get_driver()
login(driver)
display_all_project(driver)
input_project_name(driver, project_name)
select_option(driver)
click_query(driver)
screenshot(driver)
clear(driver)