https://www.selenium.dev/documentation/webdriver/browser_manipulation/
强制等待
import time# 强制等待10stime.sleep(10);
隐式等待
from selenium import webdriver# ...省略一些非关键代码driver = webdriver.Chrome(chrome_options=options)# 隐式等待 10s# 判断某元素,如果10s内未发现,则抛出异常,# 如果在5s内加载页面完成,则立即对该元素进行操作。driver.implicitly_wait(10);
显式等待
显示等待的执行原理是,程序每隔多长时间检查一次,如果条件成立,则进行下一步,否则继续等待,直到设置的最大时间,抛出TimeoutException
# 显示等待的执行原理是,程序每隔多长时间检查一次,如果条件成立,则进行下一步,否则继续等待,直到设置的最大时间,抛出TimeoutExceptionfrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdriver = 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 webdriverfrom selenium.webdriver.common.action_chains import ActionChainsdriver = 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 Keyssend_keys(Keys.BACK_SPACE) # 删除键send_keys(Keys.SPACE) # 空格键send_keys(Keys.TAB) # Tabsend_keys(Keys.ESCAPE) # ESCsend_keys(Keys.ENTER) # 回车键
基本api使用
#!/usr/bin/env python3#-*- coding: utf-8 -*-from selenium import webdriverfrom selenium.webdriver.common.by import Byimport 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_sourcedriver.implicitly_wait(10)print(html)print(driver.title)driver.quit()exit()
# 打开一个站点driver.get("https://selenium.dev")# 获取地址栏中的urldriver.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.NAMEdriver.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")# 切换到iframedriver.switch_to.frame(iframe)# Now click on buttondriver.find_element(By.TAG_NAME, 'button').click()# 如果您的框架或 iframe 具有 id 或 name 属性,# 则可以使用此属性。如果页面上的名称或 ID 不是唯一的,则将切换到第一个找到的。# 通过ID或者namedriver.switch_to.frame('buttonframe')# Now, Click on the buttondriver.find_element(By.TAG_NAME, 'button').click()# 通过tagName获取iframe = driver.find_elements_by_tag_name('iframe')[1]# 切换到iframedriver.switch_to.frame(iframe)# 要离开 iframe 或框架集,请切换回默认内容。driver.switch_to.default_content()
