一、定位元素
Selenium有两类八种定位元素的方式。
1. 单个元素定位
- 基本方式
No. | 定位方式 | 方法 | 说明 |
---|---|---|---|
1 | ID定位 | browser.find_element_by_id("ID名") |
HTML标签ID属性 |
2 | 名字定位 | browser.find_element_by_name("名字") |
HTML表单标签名字属性 |
3 | 标签名定位 | browser.find_element_by_tag_name("标签名") |
HTML标签 |
4 | 类名定位 | browser.find_element_by_class_name("类名") |
HTML标签class属性 |
5 | CSS选择器定位 | browser.find_element_by_css_selector("CSS选择器") |
CSS选择器 |
6 | XPath定位 | browser.find_element_by_xpath("xpath") |
xpath |
7 | 链接文字 | browser.find_element_by_link_text("链接文字") |
a标签文本完全匹配 |
8 | 部分链接文字 | browser.find_element_by_link_text("部分链接文字") |
a标签文本部分匹配 |
- 实践
以百度的Logo图片和输入框为例
<img hidefocus="true" class="index-logo-src" src="//www.baidu.com/img/bd_logo1.png" width="270" height="129" usemap="#mp">
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
验证代码
from selenium import webdriver import time if __name__ == "__main__": # 获取Chrome浏览器 browser = webdriver.Chrome() # Chrome浏览器以Get方式访问百度 browser.get('http://www.baidu.com/') time.sleep(2) # 浏览器最小化(这步只是为了演示方便,可以省略) browser.minimize_window() print("选取Baidu图标") # 标签名定位 print(browser.find_element_by_tag_name("img")) # 类名定位 print(browser.find_element_by_class_name("index-logo-src")) # CSS选择器定位 print(browser.find_element_by_css_selector(".index-logo-src")) # XPath定位 print(browser.find_element_by_xpath("//img[@class='index-logo-src']")) print("选取输入框") # ID定位 print(browser.find_element_by_id("kw")) # 名字定位 print(browser.find_element_by_name("wd")) # 标签名定位 print(browser.find_element_by_tag_name("input")) # 类名定位 print(browser.find_element_by_class_name("s_ipt")) # CSS选择器定位 print(browser.find_element_by_css_selector("input#kw")) # XPath定位 print(browser.find_element_by_xpath("//input[@id='kw']")) time.sleep(2) # 浏览器关闭 browser.quit()
- 通用方式
需要加上引用
from selenium.webdriver.common.by import By
上面实例可以改写成
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == "__main__": # 获取Chrome浏览器 browser = webdriver.Chrome() # Chrome浏览器以Get方式访问百度 browser.get('http://www.baidu.com/') time.sleep(2) # 浏览器最小化(这步只是为了演示方便,可以省略) browser.minimize_window() print("选取Baidu图标") # 标签名定位 print(browser.find_element(By.TAG_NAME, "img")) # 类名定位 print(browser.find_element(By.CLASS_NAME, "index-logo-src")) # CSS选择器定位 print(browser.find_element(By.CSS_SELECTOR, ".index-logo-src")) # XPath定位 print(browser.find_element(By.XPATH, "//img[@class='index-logo-src']")) print("选取输入框") # ID定位 print(browser.find_element(By.ID, "kw")) # 名字定位 print(browser.find_element(By.NAME, "wd")) # 标签名定位 print(browser.find_element(By.TAG_NAME, "input")) # 类名定位 print(browser.find_element(By.CLASS_NAME, "s_ipt")) # CSS选择器定位 print(browser.find_element(By.CSS_SELECTOR, "input#kw")) # XPath定位 print(browser.find_element(By.XPATH, "//input[@id='kw']")) time.sleep(2) # 浏览器关闭 browser.quit()
关于链接的定位
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == "__main__": # 获取Chrome浏览器 browser = webdriver.Chrome() # Chrome浏览器以Get方式访问百度 browser.get('http://www.baidu.com/') time.sleep(2) # 浏览器最小化(这步只是为了演示方便,可以省略) browser.minimize_window() # 链接定位 print(browser.find_element_by_link_text("关于百度")) # 部分链接定位 print(browser.find_element_by_partial_link_text("关于")) # 链接定位 print(browser.find_element(By.LINK_TEXT, "关于百度")) # 部分链接定位 print(browser.find_element(By.PARTIAL_LINK_TEXT, "关于")) time.sleep(2) # 浏览器关闭 browser.quit()
2. 多个元素定位
- 基本方式
与上面的操作对应多个元素的定位,区别在于,单个元素定位函数名是find_element_by_*
,返回值是一个元素;多个元素定位函数名是find_elements_by_*
,返回值为多个元素组成的序列。 - 通用方式
browser.find_elements()
定位原则:不管白猫黑猫抓住老鼠就是好猫
实例:selenium批量抓取猫眼电影Top100信息http://maoyan.com/board/4
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from time import sleep, time if __name__ == "__main__": # 获取Chrome浏览器 browser = webdriver.Chrome() start = time() # Chrome浏览器以Get方式访问百度 browser.get("http://maoyan.com/board/4") sleep(2) # 强制等待 # 定位输入框 dds = browser.find_elements_by_tag_name("dd") for dd in dds: print("index:", dd.find_element_by_tag_name("i").text) print("image:", dd.find_element_by_class_name("board-img").get_attribute("data-src")) print("title:", dd.find_element_by_css_selector("p.name").text) print("star:", dd.find_element_by_css_selector("p.star").text.strip()[3:]) print("releasetime:", dd.find_element_by_xpath("//p[@class='releasetime']").text[5:]) print("score:", dd.find_element_by_css_selector("i.integer").text + dd.find_element_by_css_selector("i.fraction").text) # print(browser.page_source) # 页面代码 # 用于延长展示时间 sleep(2) end = time() print("Run time:", end - start) # 浏览器关闭 browser.quit()
二、页面操作
- 页面交互
常用操作
No. | 方法 | 功能 |
---|---|---|
1 | element.click() |
按钮单击 |
2 | element.send_keys("字符串") |
输入框输入字符串 |
3 | element.clear() |
清空输入框 |
from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep if __name__ == "__main__": # 获取Chrome浏览器 browser = webdriver.Chrome() # Chrome浏览器以Get方式访问百度 browser.get('http://www.baidu.com/') sleep(2) # 浏览器最大化(这步只是为了演示方便,可以省略) browser.maximize_window() # 定位输入框,并输入框填写查询文字 browser.find_element_by_id("kw").send_keys("你好,Selenium") # 定位[百度一下]按钮,并单击 browser.find_element_by_id("su").click() sleep(2) # 浏览器关闭 browser.quit()
模拟回车按键,代替单击按钮
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from time import sleep if __name__ == "__main__": # 获取Chrome浏览器 browser = webdriver.Chrome() # Chrome浏览器以Get方式访问百度 browser.get('http://www.baidu.com/') sleep(2) # 浏览器最小化 browser.maximize_window() # 定位输入框 input = browser.find_element_by_id("kw") # 输入框填写查询文字 input.send_keys("你好,Selenium") # 回车 input.send_keys(Keys.RETURN) sleep(4) # 浏览器关闭 browser.quit()
操作网页的下拉
网易注册http://reg.email.163.com/unireg/call.do?cmd=register.entrance&from=163navi®Page=163
from selenium import webdriver from selenium.webdriver.support.ui import Select from time import sleep if __name__ == '__main__': driver = webdriver.Chrome() driver.get('http://reg.email.163.com/unireg/call.do?cmd=register.entrance&from=163navi®Page=163') driver.implicitly_wait(2) # 定位select元素,并创建Select对象 select = Select(driver.find_element_by_id("mainDomainSelect")) # 按照下标选择 select.select_by_index(2) sleep(2) # 按照文本选择 select.select_by_visible_text("163.com") sleep(2) # 按照值选择 select.select_by_value("126.com") sleep(2) driver.quit()
三、页面操作
1. 页面等待
Selenium有两种等待方式,加上标准库的time.sleep()
,下面做一下比较。
No. | 方法 | 模块 | 导入方式 | 特点 | 等待对象 |
---|---|---|---|---|---|
1 | sleep() |
time |
from time import sleep() |
强制等待,固定休眠时间 | 等待时间到了 |
2 | implicitly_wait() |
webdirver |
from selenium import webdriver |
隐式等待定位元素,超时抛出异常 | 等待页面加载完成 |
3 | WebDriverWait() |
webdirver |
from selenium.webdriver.support.ui import WebDriverWait |
显式等待(每隔一段时间检测元素),超时抛出异常NoSuchElementException |
等待元素加载完成 |
- 强制等待
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from time import sleep, time if __name__ == "__main__": # 获取Chrome浏览器 browser = webdriver.Chrome() start = time() # Chrome浏览器以Get方式访问百度 browser.get('http://www.baidu.com/') sleep(2) # 强制等待 # 浏览器最大化 browser.maximize_window() # 定位输入框 input = browser.find_element_by_id("kw") # 输入框填写查询文字 input.send_keys("你好,Selenium") # 回车 input.send_keys(Keys.RETURN) # 用于延长展示时间 sleep(2) end = time() print("Run time:", end - start) # 浏览器关闭 browser.quit()
- 隐式等待
隐式等待使用与time.sleep()
相似。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from time import sleep, time if __name__ == "__main__": # 获取Chrome浏览器 browser = webdriver.Chrome() start = time() # Chrome浏览器以Get方式访问百度 browser.get('http://www.baidu.com/') try: browser.implicitly_wait(2) # 隐式等待 # 浏览器最大化 browser.maximize_window() # 定位输入框 input = browser.find_element_by_id("kw") # 输入框填写查询文字 input.send_keys("你好,Selenium") # 回车 input.send_keys(Keys.RETURN) # 用于延长展示时间 sleep(2) end = time() print("Run time:", end - start) finally: # 浏览器关闭 browser.quit()
- 显式等待
显式等待可以直接使用。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import sleep, time if __name__ == "__main__": # 获取Chrome浏览器 browser = webdriver.Chrome() start = time() # Chrome浏览器以Get方式访问百度 browser.get('http://www.baidu.com/') # 浏览器最大化 browser.maximize_window() try: # 隐式等待,定位输入框 WebDriverWait(browser, 2) # 定位输入框 input = browser.find_element_by_id("kw") # 输入框填写查询文字 input.send_keys("你好,Selenium") # 回车 input.send_keys(Keys.RETURN) # 用于延长展示时间 sleep(2) end = time() print("Run time:", end - start) finally: # 浏览器关闭 browser.quit()
显式等待通常与until()
方法一起使用,参数为等待的条件。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import sleep, time if __name__ == "__main__": # 获取Chrome浏览器 browser = webdriver.Chrome() start = time() # Chrome浏览器以Get方式访问百度 browser.get('http://www.baidu.com/') # 浏览器最大化 browser.maximize_window() try: # 隐式等待,定位输入框 input = WebDriverWait(browser, 2).until( EC.presence_of_element_located((By.ID, "kw")) ) # 输入框填写查询文字 input.send_keys("你好,Selenium") # 回车 input.send_keys(Keys.RETURN) sleep(2) end = time() print("Run time:", end - start) finally: # 浏览器关闭 browser.quit()
可以同时设置隐式等待和显式等待,等待是两者之间的最大者。
2. 多窗体操作
No. | 操作 | 方法 |
---|---|---|
1 | 获取当前窗口句柄 | driver.current_window_handle |
2 | 获取所有窗口句柄 | driver.window_handles |
3 | 切换到handle 的窗口 |
driver.switch_to.window(handle) |
4 | 关闭当前的窗口 | driver.close() |
说明driver.close()
相当于关闭当前TAB选项卡driver.quit()
是退出了整个浏览器
窗口句柄是窗口的唯一标识,可看做窗口的身份证号。
from selenium import webdriver import time if __name__ == '__main__': driver = webdriver.Chrome() # 打印当前窗口句柄 driver.get('http://xueshu.baidu.com/') print(driver.current_window_handle) driver.implicitly_wait(2) # 定位导航栏上的链接,并依次打开 pages = driver.find_elements_by_css_selector('#nav_tab>a') for page in pages: page.click() # 打印所有的窗口句柄 print(driver.window_handles) # 依次切换每个窗口 for handle in driver.window_handles: driver.switch_to.window(handle) print(driver.title,driver.current_window_handle) time.sleep(1) # 依次关闭每个窗口 for handle in driver.window_handles: driver.switch_to.window(handle) driver.close() time.sleep(1)
JS操作
selenium调用js基本方式
driver.execute_script("JavaScript代码")
1. 网页提示框
from selenium import webdriver from time import sleep if __name__ == '__main__': driver = webdriver.Chrome() driver.execute_script("alert('Helle Selenium')") # 获取alert框 alert = driver.switch_to.alert # 打印alert框文本 print(alert.text) sleep(2) # 单击确认按钮 alert.accept() # 暂停5s sleep(5) # 关闭浏览器 driver.quit()
2. selenium模拟操作HTML5视频
from selenium import webdriver from time import sleep if __name__ == '__main__': driver = webdriver.Chrome() driver.get("https://www.bilibili.com/video/av33301840?spm_id_from=333.334.b_62696c695f646f756761.9") driver.implicitly_wait(3) # 获取视频元素 video = driver.find_element_by_css_selector(".bilibili-player-video>video") # 打印视频src属性 print(video.get_attribute("src")) # 打印当前视频的地址(JS方式) print(driver.execute_script("return arguments[0].currentSrc;", video)) # 播放视频 print("start") driver.execute_script("return arguments[0].play()", video) # 播放15s sleep(15) # 暂停播放 print("stop") driver.execute_script("return arguments[0].pause()", video) # 暂停5s sleep(5) # 关闭浏览器 driver.quit()
作者:jdzhangxin
链接:https://www.jianshu.com/p/1713de50265e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
来源:https://www.cnblogs.com/cherry1130/p/12366429.html