Selenium知识点

selenium文档: https://selenium-python-zh.readthedocs.io/en/latest/

selenium安装: pip install selenium
(不行就加上 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com)

使用示例:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# Keys模拟按键操作
# 配置浏览器
chrome_options = webdriver.ChromeOptions()
# "--headless" 无头浏览
chrome_options.add_argument("--headless") 	
#不加载图片
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs", prefs)
# 创建Chrome Webdriver实例
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("http://www.python.org")
assert  "Python" in driver.title
elem = driver.find_element_by_name("q")
# 先清除内容
elem.clear()
# 相当于输入"pycon"
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found" in driver.page_source
# quit将关闭整个浏览器,而close只会关闭一个标签页, 如果你只打开了一个标签页,大多数浏览器的默认行为是关闭浏览器;运行结束必须quit
driver.close()
driver.quit()

1、页面交互

打开页面:

url="https://www.baidu.com/"
# 打开页面
driver.get(url)
# 在浏览历史中前进或者后退
driver.forward()
driver.back()

获取当前页面截图:

driver.save_screenshot('screenshot.png')

获取元素:

# 可以通过已知的id/name/xpath
element = driver.find_element_by_id("kw")
element = driver.find_element_by_name("wd")
# 使用Xpath只返回查找到的第一个,若没有查找到抛出``NoSuchElementException``异常
element = driver.find_element_by_xpath("//input[@class='s_ipt']")

输入搜索的关键词:

element.clear()
element.send_keys("selenium文档")
# Keys.ENTER 按ernter键
element.send_keys(Keys.ENTER)
# 提交		找到最近的表单,返回提交它。 如果调用的元素不再表单内,将会抛出``NoSuchElementException``异常:
element.submit()

处理SELECT元素:

from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_name('name'))
select.select_by_index(index)
select.select_by_visible_text("text")
select.select_by_value(value)
# 取消所有选择
select.deselect_all()
# 获得所有已选的选项
all_selected_options = select.all_selected_options
# 获得所有选项
options = select.options

提交表单:

driver.find_element_by_id("submit").click()

拖放:

element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
# ActionChains 处理鼠标相关操作
from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()

切换不同的窗口:

# 当前的窗口名
driver.title
# driver.switch_to_window("windowName") 已经过期了改成.switch_to.window()
driver.switch_to.window("windowName")
# 查看所有窗口名
windows = driver.window_handles
for i in windows:
	# driver.switch_to_window(i)
	driver.switch_to.window(i)
	print(driver.title)
# 通过索引切换
windows = driver.window_handles
# driver.switch_to.window(windows[-1])
driver.switch_to.window(windows[-1])

切换不同的frame:

driver.switch_to_frame("frameName")
# 切换子frame
driver.switch_to_frame("frameName.0.child")
# 返回父frame
driver.switch_to_default_content()

访问弹出的对话框:

alert = driver.switch_to_alert()

操作cookie:

# 获取cookie
driver.get_cookies()
# 添加cookie
driver.add_cookie({'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BDSVRTM'})
# 删除指定cookie
driver.delete_cookie("CookieName")
# 删除所有cookie
driver.delete_all_cookies()

2、查找元素

在一个页面中有很多不同的策略可以定位一个元素。Selenium提供了下列的方法:

find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text (通过链接文本获取超链接)
find_element_by_partial_link_text (通过链接文本获取超链接)
find_element_by_tag_name (通过标签名查找元素,h1、p、a标签这些的)
find_element_by_class_name
find_element_by_css_selector

一次查找多个元素 (这些方法会返回一个list列表):

find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

还有两个私有方法, find_element 和 find_elements 。
用法示例:

from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')

下面是 By 类的一些可用属性:

ID = “id”
XPATH = “xpath”
LINK_TEXT = “link text”
PARTIAL_LINK_TEXT = “partial link text”
NAME = “name”
TAG_NAME = “tag name”
CLASS_NAME = “class name”
CSS_SELECTOR = “css selector”

找不到元素时,抛出NoSuchElementException 异常。

通过链接文本获取超链接:

<a href="continue.html">Continue</a>

continue_link = driver.find_element_by_link_text(‘Continue’)
continue_link = driver.find_element_by_partial_link_text(‘Conti’)

通过css选择器查找元素:

  <p class="content">Site content goes here.</p>

content = driver.find_element_by_css_selector(‘p.content’)

3、等待页面加载
元素不再页面之中,会抛出 ElementNotVisibleException 异常。
(1) 显式等待
等待指定的条件满足时再执行代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()
# 在抛出TimeoutException异常之前将等待10秒或者在10秒内发现了查找的元素。

WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
WebDriverWait()后有until(self, method, message)和until_not(self, method, mesage)两种方法

(2)隐式等待
等待一定时间后再开始查找元素,driver.implicitly_wait() 如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement"

(杂)
Selenium之动作链(ActionChains) 用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽等等。而selenium给我们提供了一个类来处理这类事件——ActionChains
方法可以用.连接, 比如ActionChains().move_to_element(元素).click(元素).perform()

driver.execute_script(css_selector % keyword) 执行js

‘–ignore - ssl - errors’ 忽略ssl错误 ‘–ssl - protocol = TLSv1’ ssl协议使用TLSv1
chrome_options.add_argument(“service_args = [’–ignore - ssl - errors = true’, ‘–ssl - protocol = TLSv1’]”)
self.driver.execute_script("$(’#mobile’).val(%s)" % self.phone) # 填写phone
分辨率设置 影响获取可见元素

driver.close()
必须关闭driver, driver.quit(), 否则还会有很多残留的缓存chrome/driver, lsof|grep chrome或driver|cut -c 11-15|xargs kill 清理缓存lsof|grep deleted|cut -c 11-15|xargs kill

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值