https://www.selenium.dev/documentation/webdriver/browser_manipulation/
强制等待
import time
# 强制等待10s
time.sleep(10);
隐式等待
from selenium import webdriver
# ...省略一些非关键代码
driver = webdriver.Chrome(chrome_options=options)
# 隐式等待 10s
# 判断某元素,如果10s内未发现,则抛出异常,
# 如果在5s内加载页面完成,则立即对该元素进行操作。
driver.implicitly_wait(10);
显式等待
显示等待的执行原理是,程序每隔多长时间检查一次,如果条件成立,则进行下一步,否则继续等待,直到设置的最大时间,抛出TimeoutException
# 显示等待的执行原理是,程序每隔多长时间检查一次,如果条件成立,则进行下一步,否则继续等待,直到设置的最大时间,抛出TimeoutException
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.Chrome();
driver.get("https://www.baidu.com");
# WebDriverWait需要与until或until_not方法结合使用
# WebDriverWait(driver, timeout, poll_frequency, ignored_exceptions)
# timeout:超时时间
# poll_frequency调用until或until_not方法的间隔时间
# ignored_exceptions 忽略
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "sb_form_q")))
element.send_keys("bella")
鼠标操作
click(on_element=None) # 单击鼠标左键
context_click(on_element=None) # 单击鼠标右键
double_click(on_element=None) # 双击鼠标左键
drag_and_drop(source, target) # 拖拽某个元素然后松开
perform() # 执行所有ActiveChains中存储的行为
release(on_element=None) # 在某个元素位置松开鼠标左键
send_keys(*keys_to_send); # 发送某个键到当前焦点的元素
move_to_element(on_element=None) # 鼠标悬停
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
sleep(1)
right = driver.find_element_by_xpath("//input[@id='sb_form_q']")
ActionChains(driver).context_click(right).perform()
target = driver.find_element_by_xpath("//input[@id='sb_form_q_2']")
ActionChains(driver).drag_and_drop(element, target).perform()
键盘的操作
from selenium.webdriver.common.keys import Keys
send_keys(Keys.BACK_SPACE) # 删除键
send_keys(Keys.SPACE) # 空格键
send_keys(Keys.TAB) # Tab
send_keys(Keys.ESCAPE) # ESC
send_keys(Keys.ENTER) # 回车键
基本api使用
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 设置移动端之心
mobileEmulation = {'deviceName': 'iPhone 6/7/8'}
options = webdriver.ChromeOptions()
options.add_experimental_option('mobileEmulation', mobileEmulation)
# 设置后台执行
# 浏览器后台执行
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=options)
# browser = webdriver.Chrome()
driver.get('http://www.baidu.com')
html = driver.page_source
driver.implicitly_wait(10)
print(html)
print(driver.title)
driver.quit()
exit()
# 打开一个站点
driver.get("https://selenium.dev")
# 获取地址栏中的url
driver.current_url
# 按浏览器的回退按钮
driver.back()
# 按浏览器的前进按钮
driver.forward()
# 刷新当前页面
driver.refresh()
# 获取页面当前标题
driver.title
# 等待10s,这个和time.sleep(10)有区别,time.sleep(10)会强制等待10s,
# implicitly_wait(10) 只要找到了元素就开始执行
driver.implicitly_wait(10)
# 获取页面源代码
driver.page_source
# 浏览器选项卡,获取窗口句柄
driver.current_window_handle
# 浏览器选项卡,获取当前窗口句柄数组
driver.window_handles
# 创建一个新的浏览器选项卡,并切换过去
driver.switch_to.new_window('tab')
# 切换到新的窗口选项卡,传入窗口句柄
driver.switch_to.window(window_handle)
# 关闭当前选项卡
driver.close()
# 查询元素并且点击 click
# from selenium.webdriver.common.by import By
# By.LINK_TEXT, By.CLASS_NAME, By.ID, By.NAME
driver.find_element(By.LINK_TEXT, "new window").click()
driver.find_element(By.ID, "nav").click()
# 屏幕截图,在后台执行也可以截图
driver.get_screenshot_as_file('./h5.png')
# 获取浏览器宽高
size = driver.get_window_size()
width = size.get("width")
height = size.get("height")
注意iframe的情况
<div id="modal">
<iframe id="buttonframe" name="myframe" src="https://seleniumhq.github.io">
<button>Click here</button>
</iframe>
</div>
# 获取iframe元素
iframe = driver.find_element(By.CSS_SELECTOR, "#modal > iframe")
# 切换到iframe
driver.switch_to.frame(iframe)
# Now click on button
driver.find_element(By.TAG_NAME, 'button').click()
# 如果您的框架或 iframe 具有 id 或 name 属性,
# 则可以使用此属性。如果页面上的名称或 ID 不是唯一的,则将切换到第一个找到的。
# 通过ID或者name
driver.switch_to.frame('buttonframe')
# Now, Click on the button
driver.find_element(By.TAG_NAME, 'button').click()
# 通过tagName获取
iframe = driver.find_elements_by_tag_name('iframe')[1]
# 切换到iframe
driver.switch_to.frame(iframe)
# 要离开 iframe 或框架集,请切换回默认内容。
driver.switch_to.default_content()