Selenium WebDriver API 是 Selenium 提供的一组方法和类,用于控制浏览器和操作 Web 元素。这些 API 提供了丰富的功能,包括但不限于:
1. **查找元素**:通过不同的定位方式(如ID、Class Name、XPath等)在页面中查找元素。
2. **模拟用户操作**:包括点击、输入文本、清除文本、提交表单等操作。
3. **处理弹出框**:可以处理页面中的警告框、确认框和提示框。
4. **窗口和标签页管理**:可以打开新的窗口或标签页,切换窗口,关闭窗口等操作。
5. **浏览器导航**:可以前进、后退、刷新页面等浏览器导航操作。
6. **执行 JavaScript**:可以在页面上执行 JavaScript 脚本。
7. **等待机制**:包括隐式等待和显式等待,用于处理页面加载延迟、元素可见性等情况。
8. **浏览器设置**:可以设置浏览器的参数和选项,如窗口大小、浏览器语言等。
总之,Selenium WebDriver API 提供了丰富的工具和接口,使得开发人员可以轻松地控制浏览器和操作页面元素,实现自动化测试脚本的编写和执行。
--------------------
以下是 Selenium WebDriver API 中涉及的一些常用方法和类:
### 方法(Methods):
1. **find_element(by, value)**:查找页面中第一个符合条件的元素。
2. **find_elements(by, value)**:查找页面中所有符合条件的元素。
3. **get(url)**:访问指定的 URL。
4. **click()**:点击元素。
5. **send_keys(*value)**:向输入框中输入文本。
6. **clear()**:清除输入框中的文本。
7. **submit()**:提交表单。
8. **execute_script(script, *args)**:在页面上执行 JavaScript 脚本。
9. **switch_to.frame(frame_reference)**:切换到指定的 iframe 或 frame。
10. **switch_to.window(window_name)**:切换到指定的窗口。
11. **close()**:关闭当前窗口。
12. **quit()**:关闭浏览器并退出 WebDriver。
13. **get_attribute(name)**:获取元素的指定属性值。
14. **is_displayed()**:判断元素是否可见。
15. **is_enabled()**:判断元素是否可用。
16. **is_selected()**:判断元素是否被选中。
17. **back()**:后退到上一个页面。
18. **forward()**:前进到下一个页面。
19. **refresh()**:刷新当前页面。
20. **save_screenshot(filename)**:保存当前页面截图。
21. **add_cookie(cookie_dict)**:添加 Cookie。
22. **delete_cookie(name)**:删除指定名称的 Cookie。
23. **delete_all_cookies()**:删除所有 Cookie。
24. **get_cookies()**:获取当前页面的所有 Cookie。
### 类(Classes):
1. **WebDriver**:WebDriver 接口,代表了浏览器实例。
2. **WebElement**:WebElement 接口,代表了页面中的一个元素。
3. **By**:By 类,包含了一组用于定位元素的方法。
4. **ActionChains**:ActionChains 类,用于执行各种用户交互操作。
5. **Options**:Options 接口,代表了浏览器的选项和配置。
6. **Keys**:Keys 类,包含了一组用于模拟键盘按键的常量。
7. **Timeouts**:Timeouts 接口,用于设置等待超时时间。
8. **WindowHandles**:WindowHandles 接口,用于管理浏览器窗口。
这些方法和类可以帮助开发人员控制浏览器和操作页面元素,实现自动化测试任务。
--------------------
### 类(Classes)示例介绍:
#### 1. WebDriver:
WebDriver 接口代表了浏览器实例,通过它可以创建浏览器对象并控制浏览器的行为。
from selenium import webdriver
# 创建 Chrome 浏览器实例
driver = webdriver.Chrome()
# 访问网页
driver.get("https://www.example.***")
#### 2. WebElement:
WebElement 接口代表了页面中的一个元素,可以通过定位方式找到元素并进行操作。
from selenium import webdriver
# 创建 Chrome 浏览器实例
driver = webdriver.Chrome()
# 定位并点击按钮元素
button_element = driver.find_element_by_id("button")
button_element.click()
#### 3. By:
By 类包含了一组用于定位元素的方法,常用于在 WebDriver 中查找页面元素。
from selenium import webdriver
from selenium.webdriver.***mon.by import By
# 创建 Chrome 浏览器实例
driver = webdriver.Chrome()
# 定位并点击按钮元素(使用 By.ID 定位)
button_element = driver.find_element(By.ID, "button")
button_element.click()
#### 4. ActionChains:
ActionChains 类用于执行各种用户交互操作,如鼠标移动、双击、右键点击等。
from selenium import webdriver
from selenium.webdriver.***mon.action_chains import ActionChains
# 创建 Chrome 浏览器实例
driver = webdriver.Chrome()
# 定位元素
element = driver.find_element_by_id("myElement")
# 创建 ActionChains 对象
actions = ActionChains(driver)
# 鼠标移动到元素上
actions.move_to_element(element).perform()
#### 5. Options:
Options 接口代表了浏览器的选项和配置,可以用于设置浏览器的参数。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 创建 Chrome 浏览器选项对象
chrome_options = Options()
# 设置浏览器参数
chrome_options.add_argument("--headless") # 设置为无头模式
# 创建 Chrome 浏览器实例,并加载选项
driver = webdriver.Chrome(options=chrome_options)
# 访问网页
driver.get("https://www.example.***")
#### 6. Keys:
Keys 类包含了一组用于模拟键盘按键的常量,可以用于模拟键盘操作。
from selenium import webdriver
from selenium.webdriver.***mon.keys import Keys
# 创建 Chrome 浏览器实例
driver = webdriver.Chrome()
# 定位输入框并输入文本
input_element = driver.find_element_by_id("myInput")
input_element.send_keys("Hello, World!")
# 模拟键盘按下 Enter 键
input_element.send_keys(Keys.ENTER)
#### 7. Timeouts:
Timeouts 接口用于设置等待超时时间,可以在 WebDriver 中设置隐式等待或显式等待的超时时间。
from selenium import webdriver
# 创建 Chrome 浏览器实例
driver = webdriver.Chrome()
# 设置隐式等待超时时间为10秒
driver.implicitly_wait(10)
# 访问网页
driver.get("https://www.example.***")
#### 8. WindowHandles:
WindowHandles 接口用于管理浏览器窗口,可以获取当前窗口句柄、切换窗口等操作。
from selenium import webdriver
# 创建 Chrome 浏览器实例
driver = webdriver.Chrome()
# 打开新窗口
driver.execute_script("window.open('https://www.example.***', '_blank');")
# 获取所有窗口句柄
window_handles = driver.window_handles
# 切换到第二个窗口
driver.switch_to.window(window_handles[1])
# 关闭当前窗口
driver.close()
*******************
在 Selenium 中,WebDriver 不区分窗口和标签页。如果你的网站打开了一个新的标签页或窗口,Selenium 会通过窗口句柄(window handle)来让你操作它。每个窗口都有一个唯一的标识符,在单个会话中保持持久性。你可以通过以下方法来获取当前窗口的窗口句柄:
current_window_handle = driver.current_window_handle
这将返回当前窗口的窗口句柄,你可以将其用于后续操作,如切换窗口或执行其他操作。
`driver.window_handles` 返回一个包含所有窗口句柄的列表。你可以使用这个列表来实现窗口之间的切换或执行其他需要窗口句柄的操作。例如:
# 获取所有窗口句柄列表
handles = driver.window_handles
# 切换到第二个窗口
driver.switch_to.window(handles[1])
这样,你就可以根据需要操作不同的窗口或标签页。
*******************
在 Selenium 4 及更高版本中,你可以使用 `switch_to.new_window()` 方法创建一个新的窗口或标签页。
以下是如何使用 python 打开一个新标签页并切换到它的示例:
from selenium import webdriver
# 创建 Chrome 驱动程序的实例
driver = webdriver.Chrome()
# 打开一个新标签页并切换到它
driver.switch_to.new_window('tab')
类似地,你可以使用以下代码打开一个新窗口并切换到它:
from selenium import webdriver
# 创建 Chrome 驱动程序的实例
driver = webdriver.Chrome()
# 打开一个新窗口并切换到它
driver.switch_to.new_window('window')
这些方法将创建一个新的窗口或标签页,并自动在屏幕上切换焦点到它,无需使用 `switch_to.window()` 方法显式切换到它。
-------------------
`selenium.webdriver` 模块是 Selenium Python 客户端库中的一个重要模块,它包含了 WebDriver 的实现以及各种与浏览器交互相关的类和方法。以下是一些常见的在 `selenium.webdriver` 模块中使用的类和方法:
1. **`webdriver` 模块下的浏览器实现类**:
- `Chrome`: Chrome 浏览器的实现类。
- `Firefox`: Firefox 浏览器的实现类。
- `Edge`: Edge 浏览器的实现类。
- 其他如 `Opera`、`Safari` 等。
2. **`webdriver.***mon.keys` 模块**:
- `Keys`: 包含了模拟键盘按键的常量,用于发送键盘输入。
3. **`webdriver.***mon.by` 模块**:
- `By`: 包含了一组用于定位元素的方法,如 ID、Class Name、XPath 等。
4. **`webdriver.support` 模块**:
- `expected_conditions`: 包含了一组用于设置显式等待条件的类和方法,如元素可见、存在、可点击等条件。
5. **`webdriver.support.ui` 模块**:
- `WebDriverWait`: 用于设置显式等待的类,结合 `expected_conditions` 中的条件来等待元素的出现。
通过 `selenium.webdriver` 模块,可以方便地创建不同浏览器的 WebDriver 实例,并进行各种操作,如访问 URL、查找元素、执行 JavaScript 等。同时,也可以结合其他模块如 `selenium.webdriver.***mon.keys` 和 `selenium.webdriver.support.ui` 来实现更复杂的操作和等待机制。
from selenium import webdriver
from selenium.webdriver.***mon.by import By
import time
driver = webdriver.Chrome()
try:
# 打开网页
driver.get("https://www.hao123.***/")
# 获取页面中所有input元素
input_elements = driver.find_elements(By.TAG_NAME, "input")
# 输出所有的input元素
for input_element in input_elements:
print(input_element.get_attribute("outerHTML"))
# 查找搜索框
search_input = driver.find_element(By.css_SELECTOR, 'input[data-hook="searchInput"]')
# 输入搜索词
search_input.send_keys("Selenium库")
# 查找搜索按钮并点击
search_button = driver.find_element(By.CSS_SELECTOR, 'input[data-hook="searchSubmit"]')
search_button.click()
# 处理新窗口,WebDriver不知道哪个窗口处于活动状态的。使用新窗口 您将需要切换到它。
handles = driver.window_handles
if len(handles) > 1:
driver.switch_to.window(handles[1]) # 切换到新打开的窗口
# 在这里可以添加等待搜索结果加载完成的逻辑
time.sleep(8) # 等待5秒钟
finally:
# 关闭浏览器
driver.quit()
from selenium import webdriver
# 创建 Chrome 浏览器实例,并设置隐式等待时间为10秒
driver = webdriver.Chrome()
driver.implicitly_wait(10)
# 后续的元素查找操作会等待最多10秒
element = driver.find_element_by_id("myElement")
from selenium import webdriver
from selenium.webdriver.***mon.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 创建 Chrome 浏览器实例
driver = webdriver.Chrome()
# 显式等待,等待10秒直到元素可见
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "myElement"))
)