selenium官网介绍和说明:https://www.selenium.dev/zh-cn/documentation/webdriver/getting_started/first_script/
webdriver驱动文件的路径是相对的,webdriver驱动文件的获取是自动下载的代码下载保存的,可参考:https://blog.youkuaiyun.com/weixin_45531218/article/details/133977104
改了初始化函数,之前的用的旧的方法(webdriver.Chrome(executable_path = ‘路径’)),要么就是报错,要么就是提示不适用了。现在换成新版的写法(webdriver.Chrome(service = chromeService))。
from selenium import webdriver
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By
class BasePage():
'''将selenium的功能二次封装成'''
def __init__(self, driver_='Chrome'):
# 初始化函数
options = Options()
options.add_experimental_option('detach', True)#在驱动过程结束后保持浏览器的打开状态。让浏览器不在代码执行完后自动退出,除非执行quit()
if driver_.lower() == 'edge':
edgeService = EdgeService(executable_path = dirname(dirname(__file__)) + "\\webdrivers\\driver_files\\msedgedriver.exe")
self.driver = webdriver.Edge(service = edgeService, options=options)
elif driver_.lower() == 'firefox':
firefoxService = FirefoxService(executable_path = dirname(dirname(__file__)) + "\\webdrivers\\driver_files\\geckodriver.exe")
self.driver = webdriver.Firefox(service = firefoxService)
else:
chromeService = ChromeService(executable_path = dirname(dirname(__file__)) + "\\webdrivers\\driver_files\\chromedriver.exe")
self.driver = webdriver.Chrome(service = chromeService)
def open(self, url):
# 打开浏览器,并且访问url
self.driver.get(url)
def quit(self):
self.driver.quit()
def find_element(self, by, value):
'''
返回查找到的元素
by 方式,可选值为:id、name、class_name、tag_name、link_text、partial_link_text,css_selector、xpath
'''
if by == 'ID':
return self.driver.find_element(By.ID, value)
elif by == 'NAME':
return self.driver.find_element(By.NAME, value)
elif by == 'CLASS_NAME':
return self.driver.find_element(By.CLASS_NAME, value)
elif by == 'TAG_NAME':
return self.driver.find_element(By.TAG_NAME, value)
elif by == 'LINK_TEXT':
return self.driver.find_element(By.LINK_TEXT, value)
elif by == 'PARTIAL_LINK_TEXT':
return self.driver.find_element(By.PARTIAL_LINK_TEXT, value)
elif by == 'CSS_SELECTOR':
return self.driver.find_element(By.CSS_SELECTOR, value)
elif by == 'XPATH':
return self.driver.find_element(By.XPATH, value)
else:
return None
def set_window_size(self, weight, height):
''' 设置宽高 '''
if weight >= 0 and height >= 0:
self.driver.set_window_size(weight, height)
else:
self.driver.maximize_window()
def back(self):
''' 后退 '''
self.driver.back()
def forward(self):
''' 前进 '''
self.driver.forward()
def refresh(self):
''' 刷新页面 '''
self.driver.refresh()
######键盘操作#################
def send_keys(self, by, value, text):
''' 输入文本 '''
self.find_element(by, value).send_keys(text)
def send_ctrl(self, by, value, str):
''' 输入ctrl + 一个字符 '''
self.find_element(by, value).send_keys(Keys.CONTROL, str)
def clear(self, by, value):
self.find_element(by,value).clear()
# self.driver.find_element(by, value).clear() #这种写法的入参,by = By.ID ,需要在创建类的文件中导入By(from selenium.webdriver.common.by import By)
#######鼠标操作###########
def click(self, by, value):
''' 单击元素 '''
self.find_element(by, value).click()
def context_click(self, by, value):
''' 右击元素 '''
action = ActionChains(self.driver)
e1 = self.find_element(by, value)
action.context_click(e1)
action.perform()
def double_click(self, by, value):
''' 双击元素 '''
ActionChains(self.driver).double_click(self.find_element(by, value)).perform()
def move_to_element(self, by, value):
''' 鼠标悬停到元素上 '''
ActionChains(self.driver).move_to_element(self.find_element(by, value)).perform()
######设置元素等待###################
def wait(self, timeout, step, method, message = ''):
if method:
return WebDriverWait(self.driver, timeout, step).until(method,message)
else:
return WebDriverWait(self.driver, timeout, step)
def implicitly_wait(self, time_to_wait):
self.driver.implicitly_wait(time_to_wait)
例:
page1 = BasePage.BasePage('edge')
page1.open('https://www.baidu.com')
page1.set_window_size(1500, 900)
page1.send_keys('ID', 'kw', 'selenium')
page1.click('XPATH', '//*[@id="su"]')
# 找个连接试下右击
element = page1.wait(10, 1, EC.presence_of_element_located(
(By.XPATH, '//*[@id="1"]/div/div[1]/div[2]/div[2]/div[1]/h3/a/div/div')), '设定时间内没有找到相应的内容!')
if element:
page1.move_to_element('XPATH', '//*[@id="1"]/div/div[1]/div[2]/div[2]/div[1]/h3/a/div/div')
time.sleep(10)
page1.context_click('XPATH', '//*[@id="1"]/div/div[1]/div[2]/div[2]/div[1]/h3/a/div/div')
else:
print('没有找到需要悬停的元素')
增加了frame切换的函数
def switch_frame_by_frame_name(self, iframe_name):
'''通过iframe/frame的 name属性来查找并切换到frame'''
self.driver.switch_to.frame(iframe_name)
def switch_frame_by_frame(self, frame):
''' frame为一个元素对象,直接切换到frame'''
self.driver.switch_to.frame(frame)
def switch_frame_to_default_content(self):
self.driver.switch_to.default_content()
例:
page1 = BasePage.BasePage('edge')
page1.open('https://mail.qq.com')
page1.set_window_size(1200, 1000)
page1.wait(30,1,EC.presence_of_element_located((By.XPATH, '//*[@id="QQMailSdkTool_login_loginBox_qq"]/iframe')),'设定时间内没有找到相应的内容!')
iframe = page1.find_element('CSS_SELECTOR', ".QQMailSdkTool_login_loginBox_qq_iframe")
page1.switch_frame_by_frame(iframe)
if iframe:
page1.switch_frame_by_frame_name('ptlogin_iframe')
print('第二次切换成功')
page1.click('ID', 'switcher_plogin')
page1.wait(30, 3, EC.visibility_of_element_located((By.ID, 'u')))
page1.send_keys('ID', 'u', 'hhh@qq.com')
page1.send_keys('ID', 'p', 'password')
page1.click('ID', 'login_button')
窗口切换
####window切换
def current_window_handle(self):
''' 获取当前句柄,返回为str类型 '''
return self.driver.current_window_handle
def all_window_handles(self):
''' 获取所有句柄,返回为list类型 '''
return self.driver.window_handles
def change_window_into(self, handle):
self.driver.switch_to.window(handle)
例:
page1 = BasePage.BasePage('edge')
page1.open('https://www.baidu.com')
page1.set_window_size(1500,900)
page1.send_keys('ID','kw', 'selenium')
page1.click('XPATH', '//*[@id="su"]')
handle_1 = page1.current_window_handle()
print('handle_1:', handle_1)
page1.wait(timeout = 10, method = EC.presence_of_element_located((By.XPATH, '//*[@id="1"]/div/div[1]/div[2]/div[2]/div[1]/h3/a/div/div')))
page1.click('XPATH', '//*[@id="1"]/div/div[1]/div[2]/div[2]/div[1]/h3/a/div/div')
handle_2 = page1.current_window_handle()
print('handle_2:', handle_2)
all_window_handles = page1.all_window_handles()
print('所有句柄:', all_window_handles)
#切换窗口
page1.change_window_into(all_window_handles[1])
page1.wait(10, method=EC.presence_of_element_located((By.XPATH, '//*[@id="baidu_translate_input"]')),
message='找不到textarea输入框')
page1.send_keys('XPATH', '//*[@id="baidu_translate_input"]', 'english')
print('当前窗口:', page1.current_window_handle())
截图
####截图
def save_screenshot(self, file_path):
if file_path.lower().endswith('.png'):
self.driver.save_screenshot(file_path)
else:
return False
使用
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import BasePage
page1 = BasePage.BasePage('edge')
page1.open('https://www.baidu.com')
page1.set_window_size(1500,900)
page1.send_keys('ID','kw','selenium')
page1.click('ID','su')
page1.wait(10,0.5,EC.presence_of_element_located((By.XPATH,'//*[@id="1"]/div/div[1]/div[2]/div[2]/div[1]/h3/a')), '没找到需要点击的元素')
page1.click('XPATH','//*[@id="1"]/div/div[1]/div[2]/div[2]/div[1]/h3/a')
hs = page1.all_window_handles()
page1.save_screenshot('1.jpg')
page1.change_window_into(hs[1])
page1.save_screenshot('2.png')