# CLASS_NAME 选择器
elements = driver.find_elements(By.CLASS_NAME, "name")
完整示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome()
print("成功进入")
driver.get("https://www.byhy.net/cdn2/files/selenium/stock1.html")
elements = driver.find_elements(By.CLASS_NAME, "name")
for e in elements:
print(e.text)
input()
driver.quit()
当元素有多个 class 类型时需注意区分。
6.3 tag name 选择器
用标签定位,例如 <span><div> 等,需要保证只使用了一个,不建议使用
# TAG_NAME 选择器
elements = driver.find_elements(By.TAG_NAME, "button")
完整示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome()
print("成功进入")
driver.get("https://www.byhy.net/cdn2/files/selenium/stock1.html")
elements = driver.find_elements(By.TAG_NAME, "button")
for e in elements:
print(e.text)
input()
driver.quit()
6.4 name 选择器
由于在 HTML 中 name 可以重复名,所以我们使用的时候一定要确保 name 是唯一的!
driver.get("https://dict.youdao.com/result?word=attribute&lang=en")
element = driver.find_element(By.NAME, "keywords").get_attribute("content")
print(element)
完整示例:
import time
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
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://dict.youdao.com/result?word=attribute&lang=en")
element = driver.find_element(By.NAME, "keywords").get_attribute("content")
print(element)
input()
6.5 css Selector 选择器
这个选择器是有一些语法的,一般通过浏览器复制就可以了。
在控制台中选中元素,然后右击选择'复制 selector'就行了
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get("https://www.baidu.com/")
es = driver.find_elements(By.CSS_SELECTOR, "#s-hotsearch-wrapper")
for e in es:
print(e.text)
input()
6.6 Xpath 选择器
这个选择器是有一些语法的,一般通过浏览器复制就可以了。
在控制台中选中元素,然后右击选择'复制 Xpath'就行了
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get("https://www.baidu.com/")
es = driver.find_elements(By.XPATH, '//*[@id="s-hotsearch-wrapper"]')
for e in es:
print(e.text)
input()
7、WebElement 对象的 find_element 或者 find_elements
webdriver.find_element() 返回的对象 element 也可以使用 find_element()/ find_elements(),只是 element 的区域是你选择的标签内部的区域。
例如:
<div></div><div></div><div></div><span></span>
这里面的元素标签就是 element 涵盖的区域,而 webdriver 读取到的是全局的。
element = driver.find_element(By.CLASS_NAME, "search-result")
# 在 search-result 下的所有元素 都可以通过 find_elements 或者 find_element 访问
es = element.find_elements(By.TAG_NAME, "div")
完整示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome()
print("成功进入")
driver.get("https://www.byhy.net/cdn2/files/selenium/stock1.html")
element = driver.find_element(By.CLASS_NAME, "search-result")
es = element.find_elements(By.TAG_NAME, "div")
for e in es:
print(e.text)
input()
driver.quit()
如果要读取全局的文本:
elements = driver.find_elements(By.TAG_NAME, "html")
for e in elements:
print(e.text)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
text = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "1"))
)
print(text.text)
完整示例:
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
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome()
driver.implicitly_wait(10)
print("成功进入")
driver.get("https://www.byhy.net/cdn2/files/selenium/stock1.html")
driver.find_element(By.ID, "kw").send_keys("四川\n")
text = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "1"))
)
print(text.text)
input()
driver.quit()
9、常用的操作
9.1 点击 click()
driver.find_element(By.ID, "go").click()
9.2 输入文本 send_keys()
driver.find_element(By.ID, "kw").send_keys("四川")
9.3 获取文本内容 text
element = driver.find_element(By.ID, "1")
print(element.text)
9.4 获取元素等信息 get_attribute()
在 get_attribute() 方法中输入不同的字符串有四种效果:
输入标签属性名,可以获取到该属性的值
输入 outerHTML,可以获取选中区域的所有 HTML 内容
输入 innerHTML,可以获取选中元素内部的 HTML 内容
输入 value,可以获取到输入框中,自己输入的内容
text = driver.find_element(By.ID, "kw").get_attribute("placeholder")
print(text)
也可以用来获取整个选中的 HTML:
driver.get("https://www.byhy.net/cdn2/files/selenium/stock1.html")
element = driver.find_element(By.ID, "1").get_attribute("outerHTML")
print(element)
换成输入 innerHTML,就只会打印选中标签内部的信息:
element = driver.find_element(By.ID, "1").get_attribute("innerHTML")
print(element)
由于有时候 HTML 内部嵌入了一个 HTML,那么 WebDriver 的范围就涵盖不到内嵌 HTML 中的元素。
直接进行元素定位是定位不到的,需要切换到内存 html 中:
driver.switch_to.frame('frame1')
主要标志:例如 id 和 name。
完整代码:
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
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.byhy.net/cdn2/files/selenium/sample2.html")
driver.switch_to.frame('frame1')
driver.find_element(By.ID, "searchtext").send_keys("test")
input()
如果要切换回外层的 HTML 就使用:
driver.switch_to.default_content()
完整代码:
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
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.byhy.net/cdn2/files/selenium/sample2.html")
driver.switch_to.frame('frame1')
driver.find_element(By.ID, "searchtext").send_keys("test")
driver.switch_to.default_content()
driver.find_element(By.ID, "outerbutton").click()
input()
11、窗口页面切换
当打开新的窗口,需要切换页面才可以对新页面进行操作。
核心代码:
mainWindow = driver.current_window_handle
targetWindow = Nonefor e in driver.window_handles:
if e != mainWindow:
targetWindow = e
driver.close()
driver.switch_to.window(mainWindow)
所有代码:
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
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.byhy.net/cdn2/files/selenium/sample3.html")
print("title :" + driver.title)
mainWindow = driver.current_window_handle
print("当前窗口 id" + mainWindow)
driver.find_element(By.CSS_SELECTOR, "body > a").click()
targetWindow = Nonefor e in driver.window_handles:
if e != mainWindow:
targetWindow = e
driver.switch_to.window(targetWindow)
print("当前窗口 id" + driver.current_window_handle)
import time
time.sleep(2)
driver.close()
driver.switch_to.window(mainWindow)
driver.find_element(By.CSS_SELECTOR, "#outerbutton").click()
input()
12、复选框 checkbox
可以通过具体的一个特征例如 name 都为 teachers1,然后:checked。配合 find_elements 可以了。
radio 框(单选框)和这个原理一样。
核心代码:
eles = driver.find_elements(By.CSS_SELECTOR, "[name=teachers1]:checked")
完整代码:
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
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.byhy.net/cdn2/files/selenium/test2.html")
driver.find_element(By.CSS_SELECTOR, "#s_checkbox > input[type=checkbox]:nth-child(3)").click()
eles = driver.find_elements(By.CSS_SELECTOR, "[name=teachers1]:checked")
for e in eles:
print(e.get_attribute("value"))
13、下拉框 select
13.1 Select 单选框
获取选项框中被选中的选项。
需要导入一个新的对象 Select
核心代码:
from selenium.webdriver.support.select import Select
select = Select(driver.find_element(By.ID, "ss_single"))
for se in select.all_selected_options:
print(se.text)
input()
完整代码:
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
from selenium.webdriver.support.select import Select
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.byhy.net/cdn2/files/selenium/test2.html")
select = Select(driver.find_element(By.ID, "ss_single"))
for se in select.all_selected_options:
print(se.text)
input()
select = Select(driver.find_element(By.ID, "ss_multi"))
select.deselect_all()
select.select_by_visible_text("小江老师")
select.select_by_visible_text("小雷老师")
for se in select.all_selected_options:
print(se.text)
input()
全部代码:
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
from selenium.webdriver.support.select import Select
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.byhy.net/cdn2/files/selenium/test2.html")
select = Select(driver.find_element(By.ID, "ss_multi"))
select.deselect_all()
select.select_by_visible_text("小江老师")
select.select_by_visible_text("小雷老师")
for se in select.all_selected_options:
print(se.text)
input()
14、ActionChains 模拟鼠标操作
14.1 操作试例
完成以下两个动作:悬停、拖放。
核心代码:
from selenium.webdriver.common.action_chains import ActionChains
ac = ActionChains(driver)
ac.move_to_element(
driver.find_element(By.ID, "navbarDropdown")
).perform()
import time
time.sleep(3)
for i inrange(1, 6):
ac.drag_and_drop(
driver.find_element(By.ID, "course-" + str(i)),
driver.find_element(By.ID, "selected-courses")
).perform()
time.sleep(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
from selenium.webdriver.common.action_chains import ActionChains
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.byhy.net/cdn2/files/selenium/sample4.html")
ac = ActionChains(driver)
ac.move_to_element(
driver.find_element(By.ID, "navbarDropdown")
).perform()
import time
time.sleep(3)
for i inrange(1, 6):
ac.drag_and_drop(
driver.find_element(By.ID, "course-" + str(i)),
driver.find_element(By.ID, "selected-courses")
).perform()
time.sleep(1)
input()
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
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.implicitly_wait(5)
driver.get("https://www.byhy.net/cdn2/files/selenium/test4.html")
driver.find_element(By.ID, "b1").click()
alert = driver.switch_to.alert
print(alert.text)
alert.accept()
input()