from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import base64
import time
'''
from selenium.webdriver.common.by import By
By.method method 种类
CLASS_NAME
CSS_SELECTOR
ID
LINK_TEXT
NAME
PARTIAL_LINK_TEXT
TAG_NAME
XPATH
'''
r'''
from selenium.webdriver.common.keys import Keys
Keys中的特殊按键代表的Unicode编码
ADD = '\ue025'
ALT = '\ue00a'
ARROW_DOWN = '\ue015'
ARROW_LEFT = '\ue012'
ARROW_RIGHT = '\ue014'
ARROW_UP = '\ue013'
BACKSPACE = '\ue003'¶
BACK_SPACE = '\ue003'
CANCEL = '\ue001'
CLEAR = '\ue005'
COMMAND = '\ue03d'
CONTROL = '\ue009'
DECIMAL = '\ue028'
DELETE = '\ue017'
DIVIDE = '\ue029'
DOWN = '\ue015'
END = '\ue010'
ENTER = '\ue007'
EQUALS = '\ue019'
ESCAPE = '\ue00c'
F1 = '\ue031'
F10 = '\ue03a'
F11 = '\ue03b'
F12 = '\ue03c'
F2 = '\ue032'
F3 = '\ue033'
F4 = '\ue034'
F5 = '\ue035'
F6 = '\ue036'
F7 = '\ue037'
F8 = '\ue038'
F9 = '\ue039'
HELP = '\ue002'
HOME = '\ue011'
INSERT = '\ue016'
LEFT = '\ue012'
LEFT_ALT = '\ue00a'
LEFT_CONTROL = '\ue009'
LEFT_SHIFT = '\ue008'
META = '\ue03d'
MULTIPLY = '\ue024'
NULL = '\ue000'
NUMPAD0 = '\ue01a'
NUMPAD1 = '\ue01b'
NUMPAD2 = '\ue01c'
NUMPAD3 = '\ue01d'
NUMPAD4 = '\ue01e'
NUMPAD5 = '\ue01f'
NUMPAD6 = '\ue020'
NUMPAD7 = '\ue021'
NUMPAD8 = '\ue022'
NUMPAD9 = '\ue023'
PAGE_DOWN = '\ue00f'
PAGE_UP = '\ue00e'
PAUSE = '\ue00b'
RETURN = '\ue006'
RIGHT = '\ue014'
SEMICOLON = '\ue018'
SEPARATOR = '\ue026'
SHIFT = '\ue008'
SPACE = '\ue00d'
SUBTRACT = '\ue027'
TAB = '\ue004'
UP = '\ue013'
'''
# 自定义显示等待条件
class ElementHasCssClass(object):
def __init__(self, locator, css_class):
self.locator = locator
self.css_class = css_class
def __call__(self, driver):
element = driver.find_element(*self.locator)
if self.css_class in element.get_attribute('id'):
return element
else:
return None
# selenium入门知识
def base_selenium_performance():
url = 'https://www.baidu.com'
# webdriver.Chrome()初始化浏览器
driver = webdriver.Chrome()
'''
其他浏览器初始化:
webdriver.Firefox
webdriver.FirefoxProfile
webdriver.Chrome
webdriver.ChromeOptions
webdriver.Ie
webdriver.Opera
webdriver.PhantomJS
webdriver.Remote
webdriver.DesiredCapabilities
webdriver.ActionChains
webdriver.TouchActions
webdriver.Proxy
'''
# driver.minimize_window()屏幕最小化
driver.minimize_window()
time.sleep(1)
# driver.maximize_window()屏幕最大化
driver.maximize_window()
time.sleep(1)
'''
自定义屏幕大小
driver.set_window_size(width, height, windowsHandler)
'''
try:
# driver.implicitly_wait(time)隐式等待
driver.implicitly_wait(10)
# driver.get(url=None)将定位给定的URL网页
driver.get(url)
# driver.switch_to.alert 窗口弹窗处理
try:
alert = driver.switch_to.alert
alert.send_keys("Mike")
alert.accept()
'''
alert.accept() 接受/确认弹窗
alert.dismiss() 拒绝/取消弹窗
alert..send_keys() 向弹窗中传递数据
alert.text 获取弹窗中的文本
'''
except:
print('there is no alert')
set_btn = driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')
actions = ActionChains(driver)
actions.move_to_element(set_btn).perform()
# WebDriverWait(driver, time).until(EC.condition((method, value)))
WebDriverWait(driver, 10).until(ElementHasCssClass((By.ID, 'kw'), 'kw'))
'''
其他condition条件
title_is 标题是某内容
title_contains 标题包含某内容
present_of_element_located 节点加载出来,传入定位元组,例如:(By.ID, 'kw')
visible_of_element_located 节点课件,传入定位元组
visible_of 可见,传入节点对象
present_of_all_elements_located 所有节点加载出来
text_to_be_present_in_element 某节点中包含某些内容
text_to_be_present_in_element_value 某节点值种包含某些内容
frame_to_be_available_and_switch_to_it 加载并切换
invisibility_of_element_located 节点不可见
element_to_be_clickable 节点可点击
staleness_of 判断一个节点是否仍为DOM,可判断页面是否刷新
element_to_be_selected 节点可选择,传入节点对象
element_located_to_be_selected 节点可选择,传入定位元组
element_selection_state_to_be 传入节点对象以及状态,相等返回True,否则返回False
element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False
alert_is_present 是否出现警告
'''
# selenium.webdriver.chrome.webdriver.WebDriver.current_url 打印当前网页URL
print(driver.current_url)
# selenium.webdriver.chrome.webdriver.WebDriver.get_cookies() 打印网页cookie
print(driver.get_cookies())
# selenium.webdriver.chrome.webdriver.WebDriver.page_source 打印网页源代码
print(driver.page_source)
# selenium.webdriver.chrome.webdriver.WebDriver.page_source 打印网页源title
print(driver.title)
news_titles = driver.find_elements_by_xpath("//li[@class='hotsearch-item odd']"
"/a/span[@class='title-content-title']")
for news_title in news_titles:
# element.get_attribute 获取标签属性
print(news_title.get_attribute('class'))
# element.text 获取标签内容
print(news_title.text)
'''
也可指直接获取其标签中属性
element.id
element.location
element.tag_name
element.size
'''
# driver.find_element_by_id根据id获取属性元素
driver.find_element_by_id('kw').send_keys('python')
time.sleep(1)
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a')
time.sleep(1)
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'x')
time.sleep(1)
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'v')
time.sleep(1)
'''
其他获取一个元素的方法:
find_element_by_id 根据id
find_element_by_name 根据name
find_element_by_xpath 根据xpath
find_element_by_link_text 根据文本
find_element_by_partial_link_text 根据固定文本
find_element_by_tag_name 根据标签名
find_element_by_class_name 根据标签的class属性
find_element_by_css_selector 根据css选择器
上述函数等价于:
find_element(By.method, value)
例如:driver.find_element_by_id('kw')
<=>driver.find_element(By.ID, 'kw')
获取多个元素的方法:
find_elements_by_id 根据id
find_elements_by_name 根据name
find_elements_by_xpath 根据xpath
find_elements_by_link_text 根据文本
find_elements_by_partial_link_text 根据固定文本
find_elements_by_tag_name 根据标签名
find_elements_by_class_name 根据标签的class属性
find_elements_by_css_selector 根据css选择器
上述函数等价于:
find_elements(By.method, value)
例如:driver.find_elements_by_id('kw')
<=>driver.find_elements(By.ID, 'kw')
'''
'''
IO交互
element.send_keys(text) 向element传递text文本
element.clear() 清空element中的内容
element.click() 点击element
'''
search_btn = driver.find_element_by_id('su')
search_btn.click()
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
time.sleep(2)
driver.execute_script('alert("To Bottom")')
time.sleep(2)
alert = driver.switch_to.alert
alert.accept()
# element.is_display() 是否存在某个元素
print(search_btn.is_displayed())
# print(search_btn.is_selected())
# print(search_btn.is_enabled())
time.sleep(2)
'''
element.is_enabled() 元素是否可操作
element.is_selected() 元素是否被选中(通常出现在单选按钮、复选框)
'''
time.sleep(5)
driver.get("https://www.taobao.com")
time.sleep(2)
# driver.back()返回前一个页面
driver.back()
time.sleep(2)
# driver.forward()返回到后一个页面
driver.forward()
time.sleep(2)
driver.back()
time.sleep(2)
driver.get("http://www.example.com")
time.sleep(2)
# driver.get_cookies() 获取页面返回的cookie属性
print(driver.get_cookies())
# driver.add_cookie() 向页面返回的Cookies属性中添加内容
driver.add_cookie({'name': 'Bob', 'age': 20, 'value': 'you'})
print(driver.get_cookies())
# driver.delete_all_cookies() 删除所有页面返回的cookies信息
driver.delete_all_cookies()
print(driver.get_cookies())
driver.back()
time.sleep(2)
# driver.window_handles当前网页选项卡
print(driver.window_handles)
# driver.execute_script()执行js脚本
driver.execute_script('window.open()')
'''
也可以使用以下方法打开一个新窗口
driver.get('https://www.baidu.com')
time.sleep(2)
header = driver.find_element_by_id('head_wrapper')
header.click()
header.send_keys(Keys.CONTROL, 't')
'''
print(driver.window_handles)
# driver.switch_to.window()切换网页选项卡
driver.switch_to.window(driver.window_handles[1])
driver.get('https://www.taobao.com')
time.sleep(2)
print(driver.window_handles)
driver.close()
print(driver.window_handles)
driver.switch_to.window(driver.window_handles[0])
assert "百度搜索" in driver.page_source
# driver.get_screenshot_as_file()获取屏幕闪照
driver.get_screenshot_as_file("E:/projectOfPython/projectOfSpiderHomeworkD/baidu.png")
'''
网页截图
driver.get_screenshot_as_file(filename)
driver.get_screenshot_as_png()
with open(filepath, 'wb) as f:
f.write(driver.get_screenshot_as_png())
对base64模式处理文件页面进行了方法封装
driver.get_screenshot_as_base64()
with open(filepath, 'wb) as f:
f.write(base64.b64decode(driver.get_screenshot_as_base64().encode('ascii)))
'''
except TimeoutException:
print('Time Out')
except NoSuchElementException:
print('No Such Element')
finally:
time.sleep(2)
# driver.close()关闭页面
driver.close()
'''
dirver.quit()关闭页面
'''
'''
所有Webdriver代码中可能发生的异常:
selenium.common.exceptions 异常
ElementClickInterceptedException (msg = None,screen = None,stacktrace = None
无法完成“元素点击”命令,因为接收事件的元素遮盖了请求单击的元素。
ElementNotInteractableException (msg = None,screen = None,stacktrace = None )
当元素存在于DOM中但与该元素的交互会命中另一个元素时抛出,以绘制顺序
ElementNotSelectableException (msg = None,screen = None,stacktrace = None )
尝试选择不可选择的元素时抛出
例如,选择一个“脚本”元素
ElementNotVisibleException (msg = None,screen = None,stacktrace = None )
当元素出现在DOM上但不可见时抛出,因此无法与之交互。
尝试单击或阅读从视图中隐藏的元素的文本时最常遇到的问题
ErrorInResponseException (response,msg )[资源]
在服务器端发生错误时抛出
与firefox扩展或远程驱动程序服务器通信时,可能会发生这种情况
ImeActivationFailedException (msg = None,screen = None,stacktrace = None )
激活IME引擎时抛出失败
ImeNotAvailableException (msg = None,screen = None,stacktrace = None )
当IME支持不可用时抛出
如果计算机上没有IME支持,则会为每个与IME相关的方法调用引发此异常
InsecureCertificateException (msg = None,screen = None,stacktrace = None )
导航导致用户代理命中证书警告,这通常是TLS证书过期或无效的结果
InvalidArgumentException (msg = None,screen = None,stacktrace = None )
传递给命令的参数无效或格式错误
InvalidCookieDomainException (msg = None,screen = None,stacktrace = None )
尝试在与当前URL不同的域下添加cookie时抛出
InvalidCoordinatesException (msg = None,screen = None,stacktrace = None )
提供给交互操作的坐标无效
InvalidElementStateException (msg = None,screen = None,stacktrace = None )
由于元素处于无效状态而无法完成命令时抛出
这可能是由于尝试清除既不可编辑又不可重置的元素引起的
InvalidSelectorException (msg = None,screen = None,stacktrace = None )
当用于查找元素的选择器未返回WebElement时抛出
当前,仅当选择器是xpath表达式并且在语法上无效
(即它不是xpath表达式)或表达式未选择WebElement时(例如“ count(// input)”)
,才会发生这种情况。
InvalidSessionIdException (msg = None,screen = None,stacktrace = None )
如果给定的会话ID不在活动会话列表中,则发生,这意味着该会话不存在或未处于活动状态
InvalidSwitchToTargetException (msg = None,screen = None,stacktrace = None )
当不存在要切换的帧或窗口目标时抛出
JavascriptException (msg = None,screen = None,stacktrace = None )
执行用户提供的JavaScript时发生错误
MoveTargetOutOfBoundsException (msg = None,screen = None,stacktrace = None )
当提供给ActionsChains move()方法的目标无效(即不在文档中)时抛出
NoAlertPresentException (msg = None,screen = None,stacktrace = None )
切换为无提示时抛出
这可能是由于在屏幕上还没有警报时调用Alert()类上的操作引起的
NoSuchAttributeException (msg = None,screen = None,stacktrace = None )
在找不到元素的属性时抛出
您可能要检查该属性是否存在于要测试的特定浏览器中
某些浏览器对于同一属性可能具有不同的属性名称(IE8的.innerText与Firefox .textContent)
NoSuchCookieException (msg = None,screen = None,stacktrace = None )
在当前浏览上下文的活动文档的关联cookie中未找到与给定路径名匹配的cookie
NoSuchElementException (msg = None,screen = None,stacktrace = None )
找不到元素时抛出
如果遇到此异常,则可能需要检查以下内容:
检查您的find_by中使用的选择器...
查找操作时,元素可能尚未显示在屏幕上(网页仍在加载中)有关如何编写等待包装器以等待元素出现的信息\
请参见selenium.webdriver.support.wait.WebDriverWait()
NoSuchFrameException (msg = None,screen = None,stacktrace = None )
当不存在要切换的帧目标时抛出
NoSuchWindowException (msg = None,screen = None,stacktrace = None )
当不存在要切换的窗口目标时抛出
要查找当前的活动窗口句柄集,可以通过以下方式获得活动窗口句柄的列表:
打印driver.window_handles
RemoteDriverServerException (msg = None,screen = None,stacktrace = None )
ScreenshotException (msg = None,screen = None,stacktrace = None )
屏幕截图变得不可能
SessionNotCreatedException (msg = None,screen = None,stacktrace = None )
无法创建新的会话
StaleElementReferenceException (msg = None,screen = None,stacktrace = None )
当对元素的引用现在“陈旧”时抛出
陈旧意味着元素不再出现在页面的DOM上。
StaleElementReferenceException的可能原因包括但不限于:
您不再位于同一页面上,或者自找到元素以来该页面可能已刷新。
自找到元素以来,该元素可能已被删除并重新添加到屏幕上
例如正在重定位的元素
当值更新并重建节点时,这通常会在JavaScript框架中发生。
元素可能位于iframe或其他刷新的上下文中。
TimeoutException (msg = None,screen = None,stacktrace = None )
当命令没有在足够的时间内完成时抛出
UnableToSetCookieException (msg = None,screen = None,stacktrace = None )
当驱动程序无法设置cookie时抛出
UnexpectedAlertPresentException (msg = None,screen = None,stacktr
出现意外警报时抛出
通常在预期的模式阻止WebDriver形式执行更多命令时引发
UnexpectedTagNameException (msg = None,screen = None,stacktrace = None )
当支持类未获得预期的Web元素时抛出
UnknownMethodException (msg = None,screen = None,stacktrace = None )
请求的命令与已知URL匹配,但与该URL的方法不匹配
WebDriverException (msg = None,screen = None,stacktrace = None )
基本的webdriver异常
'''
def selenium_action_chain():
url = 'https://www.baidu.com'
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get(url)
bar = driver.find_element_by_id('kw')
btn = driver.find_element_by_id('su')
# bar.send_keys('python')
actions = ActionChains(driver)
# key_down (value,element = None )[资源]
# 仅发送按键,但不释放按键。
# 仅应与修饰键(Control,Alt和Shift)一起使用。
# 值:要发送的修饰键。值在Keys类中定义。
# element:发送密钥的元素。如果为None,则将密钥发送到当前关注的元素。
# 例如,按ctrl + c:
# key_up (value,element = None )[资源]
# 释放修饰键
# value:要发送的修饰键。值在Keys类中定义。
# element:发送密钥的元素。如果为None,则将密钥发送到当前关注的元素。
# 例如,按ctrl + c
# move_by_offset (xoffset,yoffset )[资源]
# 将鼠标移动到当前鼠标位置的偏移处。
# xoffset:要移动的X偏移量,为正整数或负整数。
# yoffset:要移动的Y偏移,为正或负整数。
# # move_to_element (to_element )
# # 将鼠标移到元素的中间
# actions.move_to_element(btn).perform()
# move_to_element_with_offset (to_element,xoffset,yoffset )[资源]
# 将鼠标移动指定元素的偏移量。
# 偏移量相对于元素的左上角。
# to_element:要移动到的WebElement。
# xoffset:要移动的X偏移量。
# yoffset:要移动的Y偏移量。
# # pause(second)
# # 暂停所有输入达指定的持续时间(以秒为单位)
# actions.pause()
#
# # perform()
# # 执行所有存储的动作
# actions.perform()
#
# # 释放(on_element = None )[资源]
# # 释放元素上按住的鼠标键
# actions.release(btn)
# # reset_actions ()[资源]
# # 清除已经在本地和远程存储的操作
# action.reset_actions()
# # send_keys_to_element (元素,* keys_to_send )[资源]
# # 将键发送到元素
# actions.send_keys_to_element(bar, 'python').perform()
#
# # send_keys (* keys_to_send )[资源]
# # 将键发送到当前的焦点元素
# actions.send_keys(bar, 'python').perform()
# btn = driver.find_element_by_id('su')
# # click_and_hold (on_element = None )
# # 在元素上按住鼠标左键。
# actions.click_and_hold(btn)
# actions.perform()
# # 点击(on_element = None )
# # 单击一个元素。
# actions.click(btn).perform()
# # btn.click()
# # context_click (on_element = None )[资源]
# # 在元素上执行上下文单击(右键单击)
# actions.context_click(btn)
# # double_click (on_element = None )[资源]
# # 双击一个元素
# actions.double_click(btn)
# url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
# driver.get(url)
# driver.switch_to.frame('iframeResult')
# source = driver.find_element_by_css_selector('#draggable')
# target = driver.find_element_by_css_selector('#droppable')
# actions = ActionChains(driver)
# # rag_and_drop (源,目标)[资源]
# # 按住源元素上的鼠标左键,
# # 然后移动到目标元素并释放鼠标按钮
# actions.drag_and_drop(source, target)
# actions.perform()
time.sleep(3)
driver.close()
base_selenium_performance()
python库的解析--selenium-python自动化(selenium库)
最新推荐文章于 2024-06-08 16:00:00 发布