Selenium库

1.常用类

from selenium import webdriver   # 驱动浏览器
from selenium.webdriver.chrome.options import Options	# 配置启动时属性的类
from selenium.webdriver import ActionChains   # 鼠标的相关操作,比如滑动验证
from selenium.webdriver.common.by import By   # 选择器,以什么方式选择标签元素
from selenium.webdriver.common.keys import Keys   # 键盘相关
from selenium.webdriver.support import expected_conditions as EC  # 各种判断,一般跟等待事件连用,比如说等待某个元素加载出来
from selenium.webdriver.support.wait import WebDriverWait  # 等待事件,可以与EC连用

2.常用的方法

from selenium import webdriver   # 驱动浏览器

driver = webdriver.Chrome()

driver.get('https://www.baidu.com')

driver.maximize_window()  # 窗口最大化

print(driver.current_url)   # 获取当前页URL

print(driver.title)   # 获取页面的title

print(driver.name)  # 获取driver对象:chrome

print(driver.current_window_handle)  # 获取当前窗口

print(driver.get_cookies())   # 获取cookies

print(driver.page_source)   # 获取当前页面内容

driver.refresh()    # 刷新

driver.save_screenshot('error.png')   # 保存截图

driver.close()   # 关闭当前窗口

driver.quit()   # 退出浏览器驱动,关闭所有关联窗口

3. 选择器

①旧版的写法 selenium<=3.3.0

from selenium import webdriver   # 驱动浏览器

driver = webdriver.Chrome()

wait = WebDriverWait(driver, 10)	# 等待10s

driver.get('https://www.baidu.com')

driver.find_element_by_id('su')  # id选择器

driver.find_element_by_class_name('xx')  # 类选择器,1个

driver.find_elements_by_class_name('xx')  # 类选择器,多个

driver.find_element_by_link_text('xxx')  # 链接文本选择器

driver.find_element_by_xpath('xxxx')  # xpath选择器

driver.find_element_by_tag_name('h1')  # 标签选择器,获取1个

driver.find_elements_by_tag_name('h1')  # 标签选择器,获取多个

driver.find_element_by_css_selector('xxx')  # 样式选择器

在选择器的选用时,要记得获取一个还是多个,要区分开find_elements还是find_element。这个s容易忽略。

② 新版本的写法

from selenium.webdriver.common.by import By  # 选择器,以什么方式选择标签元素

driver.find_element(by=By.ID, value=None)  # 选择器类型, value值
  • 常用的选择器有:
By.ID

By.LINK_TEXT

By.CLASS_NAME

By.XPATH

By.CSS_SELECTOR

By.TAG_NAME
  • 我们可以通过标签选择器来执行一些操作:
import time
from selenium import webdriver  # 驱动浏览器
from selenium.webdriver import ActionChains  # 鼠标的相关操作,比如滑动验证
from selenium.webdriver.common.by import By  # 选择器,以什么方式选择标签元素
from selenium.webdriver.common.keys import Keys  # 键盘相关
from selenium.webdriver.support import expected_conditions as EC  # 各种判断,一般跟等待事件连用
from selenium.webdriver.support.wait import WebDriverWait  # 等待事件


driver = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
driver.get('https://www.baidu.com')
input = driver.find_element(By.ID, 'kw')  # id选择器
input.send_keys('张开嘴')  # 如果获取到的是个input框,就可以往里面填值
time.sleep(1)
input.clear()   # 清空值
submit = driver.find_element(By.ID, 'su')
submit.click()  # 点击事件
# 有的时候,click事件可能会有问题,我们使用键盘事件来处理
submit.send_keys(Keys.ENTER)
print(input.get_attribute('name'))  # 获取name属性
print(input.text)   # 获取内容,但这里的input没有text
print(input.tag_name)
print(input.get_property('name'))  # 获取给定属性,用法类似get_attribute
print(driver.find_element(By.CLASS_NAME, 'mnav').text)   # 找个有text的

4. 键盘事件:

from selenium.webdriver.common.keys import Keys  # 键盘相关

print(dir(Keys))
'''
['ADD', 'ALT', 'ARROW_DOWN', 'ARROW_LEFT', 'ARROW_RIGHT', 'ARROW_UP', 'BACKSPACE', 'BACK_SPACE', 'CANCEL', 'CLEAR', 'COMMAND', 'CONTROL', 'DECIMAL', 'DELETE', 'DIVIDE', 'DOWN', 'END', 'ENTER', 'EQUALS', 'ESCAPE', 'F1', 'F10', 'F11', 'F12', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'HELP', 'HOME', 'INSERT', 'LEFT', 'LEFT_ALT', 'LEFT_CONTROL', 'LEFT_SHIFT', 'META', 'MULTIPLY', 'NULL', 'NUMPAD0', 'NUMPAD1', 'NUMPAD2', 'NUMPAD3', 'NUMPAD4', 'NUMPAD5', 'NUMPAD6', 'NUMPAD7', 'NUMPAD8', 'NUMPAD9', 'PAGE_DOWN', 'PAGE_UP', 'PAUSE', 'RETURN', 'RIGHT', 'SEMICOLON', 'SEPARATOR', 'SHIFT', 'SPACE', 'SUBTRACT', 'TAB', 'UP']
'''
  • 键盘事件示例:
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()

try:
	driver.get('https://pythonav.com/login/')

	input_obj = driver.find_element(By.ID, 'id_username')
	time.sleep(2)
	input_obj.send_keys('selenium is cool')
	time.sleep(2)
	input_obj.send_keys(Keys.CONTROL, 'a')
	time.sleep(2)
	input_obj.send_keys(Keys.DELETE)
	time.sleep(3)
	input_obj.send_keys('no 。。。。。')
	time.sleep(3)

	pwd_obj = driver.find_element(By.ID, 'id_password')
	pwd_obj.send_keys('selenium is very cool')
	pwd = pwd_obj.get_attribute('value')
	print(pwd)

	js = "return $('#id_password').val()"
	res = driver.execute_script(js)
	print(res)
	js2 = "alert('{}')".format(res)
	driver.execute_script(js2)

finally:
	time.sleep(10)
	driver.quit()


5.鼠标事件

from selenium.webdriver import ActionChains  # 鼠标的相关操作,比如滑动验证

print(dir(ActionChains))
'''
['click', 'click_and_hold', 'context_click', 'double_click', 'drag_and_drop', 'drag_and_drop_by_offset', 'key_down', 'key_up', 'move_by_offset', 'move_to_element', 'move_to_element_with_offset', 'pause', 'perform', 'release', 'reset_actions', 'send_keys', 'send_keys_to_element']
'''


6. EC 判断

from selenium.webdriver.support import expected_conditions as EC  # 各种判断,一般跟等待事件连用,比如说等待某个元素加载出来

print(dir(EC))

'''
['NoAlertPresentException', 'NoSuchElementException', 'NoSuchFrameException', 'StaleElementReferenceException', 'WebDriverException', 'WebElement', 'builtins', 'cached', 'doc', 'file', 'loader', 'name', 'package', 'spec', '_element_if_visible', '_find_element', '_find_elements', 'alert_is_present', 'element_located_selection_state_to_be', 'element_located_to_be_selected', 'element_selection_state_to_be', 'element_to_be_clickable', 'element_to_be_selected', 'frame_to_be_available_and_switch_to_it', 'invisibility_of_element', 'invisibility_of_element_located', 'new_window_is_opened', 'number_of_windows_to_be', 'presence_of_all_elements_located', 'presence_of_element_located', 'staleness_of', 'text_to_be_present_in_element', 'text_to_be_present_in_element_value', 'title_contains', 'title_is', 'url_changes', 'url_contains', 'url_matches', 'url_to_be', 'visibility_of', 'visibility_of_all_elements_located', 'visibility_of_any_elements_located', 'visibility_of_element_located']
'''

expected_conditions中封装了各种判断,一般常应用于断言中和等待机制搭配使用。比如判断某个元素是否存在,存在则返回该标签对象,不存在则报报错,并且可以自定制报错:

driver = webdriver.Chrome()
try:
	print(EC.presence_of_element_located((By.ID, 'xxx'))(driver))  # 判断某个元素是否被加到了dom树里,并不代表该元素一定可见
except NoSuchElementException as e:
	print('找不到这个标签')

如上例,当前页面中没有id名为xxx的,所以报错,需要注意的是,报错也是一个对象,要想得到False结果,需要执行这个对象并且将浏览器驱动对象传进去。

其他的判断:

print(EC.title_contains('XX')(diver))  # 判断当前页面的title是否包含预期字符串

print(EC.visibility_of_element_located((By.ID, 'su'))(diver))  # 判断某个元素是否可见(代表元素非隐藏,元素的宽和高都不等于0)

print(EC.invisibility_of_element_located(((By.ID, 'xxx')))(diver))  # 判断某个元素中是否不存在于dom树或不可见

print(EC.text_to_be_present_in_element((By.ID, 'su'), '百度一下')(diver))  # 判断某个元素中的text是否包含了预期的字符串, 示例中的标签没有text值

print(EC.text_to_be_present_in_element_value((By.ID, 'su'), '百度一下')(diver))  # 判断某个元素中的value属性是否包含了预期的字符串

print(EC.alert_is_present()(diver))  # 判断页面上是否存在alert

print(EC.element_to_be_clickable((By.ID, 'su'))(diver))  # 判断某个元素中是否可见并且是enable的,这样的话才叫clickable

7.前进(forward)后退(back)和刷新(refresh)三个动作:

import time
from selenium import webdriver  # 驱动浏览器

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.get('https://www.taobao.com')
driver.get('http://www.sina.com.cn/')

time.sleep(5)
driver.back()  # 后退
time.sleep(3)
driver.forward()  # 前进
time.sleep(2)
driver.refresh()  # 刷新
driver.close()  # 关闭当前窗口
time.sleep(3)
driver.quit()

8.在有些时候,需要执行一些js代码来完成任务。

from selenium import webdriver  # 驱动浏览器

browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('alert("xxoo")')

target = self.driver.find_element(By.XPATH, "//ul[@class='test']")
driver.execute_script("arguments[0].scrollIntoView();", target)  # 将需要点击的元素移动到画面中来

driver.execute_script("window.scrollBy(0, -200)")  # 向上移动200像素

9.我的一些封装

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait as WDW
def clickable(element: str, times: int = 15) -> None:
    """Click on an element if it's clickable using Selenium."""
    try:
        WDW(driver, times).until(EC.element_to_be_clickable(
            (By.XPATH, element))).click()
    except Exception:  # Some buttons need to be visible to be clickable,
        driver.execute_script(  # so JavaScript can bypass this.
            'arguments[0].click();', visible(element))
def visible(element: str, times: int = 10):
    """Check if an element is visible using Selenium."""
    return WDW(driver,  times).until(
        EC.visibility_of_element_located((By.XPATH, element)))
def send_keys(element: str, keys: str, times: int = 20) -> None:
    """Send keys to an element if it's visible using Selenium."""
    try:
        visible(element).send_keys(keys)
    except Exception:  # Some elements are not visible but are present.
        WDW(driver, times).until(EC.presence_of_element_located(
            (By.XPATH, element))).send_keys(keys)

10.以debug模式来启动浏览器

此方法可以对浏览器有些预操作后在让selenium接管操作

options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:6666")
driver = webdriver.Chrome(options=options)
# 同时浏览器要在path中设置为全局变量
# 配合 debug.bat
chrome.exe --remote-debugging-port=6666 --user-data-dir="C:\selenum\AutomationProfile"
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值