Selenium 模块
1.selenium 模块基础
1.1 selenium 模块的安装与基础用法
Selenium 需要与浏览器相应的 WebDriver 驱动程序一起使用,以便能够控制浏览器的行为。不同的浏览器需要使用对应的 WebDriver。
以下是几个常见浏览器及其对应的 WebDriver:
- Chrome: 需要 Chrome 浏览器驱动,也叫 ChromeDriver。你可以在ChromeDriver官方网站下载。
- Firefox: 需要 GeckoDriver。你可以在GeckoDriver官方网站下载。
- Edge: 需要 Microsoft Edge 浏览器驱动,也叫 EdgeDriver。你可以在Microsoft Edge Driver官方网站下载。
请注意,每个浏览器的 WebDriver 版本应该与你本地浏览器的版本匹配。下载后,你需要将驱动程序的路径告诉 Selenium,以便它能够找到并使用它。这里我就谷歌浏览器为例,我把 chromedriver.exe 放在了我的环境解释器里面。
运行 Selenium 需要以下步骤:
- 安装 Selenium 模块:
pip install selenium
- 下载对应浏览器的 WebDriver,并确保其在系统 PATH 中,或者提供 WebDriver 路径。
- 编写 Python 脚本,使用 Selenium 模块与 WebDriver 控制浏览器。
1.2 selenium模块的标签定位
-
通过ID定位: 使用元素的ID属性来定位。示例代码:
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_id("element_id")
-
通过Name定位: 使用元素的Name属性来定位。示例代码:
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_name("element_name")
-
通过XPath定位: 使用元素的XPath表达式来定位。XPath是一种XML路径语言,它可以用来在XML文档中导航。示例代码:
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_xpath("//div[@class='example']")
-
通过CSS选择器定位: 使用CSS选择器来定位元素。示例代码:
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_css_selector("div.example")
-
通过链接文本定位: 使用链接文本来定位超链接。示例代码:
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_link_text("Example Link")
-
通过部分链接文本定位: 使用链接文本的一部分来定位超链接。示例代码:
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_partial_link_text("Example")
-
通过类名定位: 使用元素的类名来定位。示例代码:
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_class_name("example")
1.3 selenium模块的标签操作
-
点击元素:
click()
方法用于模拟点击页面上的元素,比如按钮、链接等。示例代码:from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_id("button_id") element.click()
-
输入文本:
send_keys()
方法用于向输入框或可编辑的元素中输入文本。示例代码:from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") input_element = driver.find_element_by_id("input_id") input_element.send_keys("Hello, World!")
-
清除输入框内容:
clear()
方法用于清除输入框中的文本。示例代码:from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") input_element = driver.find_element_by_id("input_id") input_element.clear()
-
获取元素文本内容:
text
属性用于获取元素的文本内容。示例代码:from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_id("element_id") text_content = element.text print(text_content)
-
获取元素属性:
get_attribute()
方法用于获取元素的属性值。示例代码:from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_id("element_id") attribute_value = element.get_attribute("attribute_name") print(attribute_value)
-
提交表单:
submit()
方法用于提交表单。示例代码:from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") form = driver.find_element_by_id("form_id") form.submit()
2. selenium模块进阶
2.1 模拟鼠标操作
-
移动到元素:
move_to_element()
方法用于将鼠标移动到指定元素上。示例代码:from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_id("element_id") actions = ActionChains(driver) actions.move_to_element(element).perform()
-
点击元素:
click()
方法用于模拟鼠标左键点击指定元素。示例代码:from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_id("element_id") actions = ActionChains(driver) actions.click(element).perform()
-
右键点击元素:
context_click()
方法用于模拟鼠标右键点击指定元素。示例代码:from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_id("element_id") actions = ActionChains(driver) actions.context_click(element).perform()
-
双击元素:
double_click()
方法用于模拟鼠标双击指定元素。示例代码:from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_id("element_id") actions = ActionChains(driver) actions.double_click(element).perform()
-
拖拽和释放:
drag_and_drop()
方法用于模拟拖拽一个元素到另一个元素。示例代码:from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("https://example.com") source_element = driver.find_element_by_id("source_element_id") target_element = driver.find_element_by_id("target_element_id") actions = ActionChains(driver) actions.drag_and_drop(source_element, target_element).perform()
2.2 <iframe>标签处理
-
切换到iframe: 在Selenium中,可以使用
switch_to.frame()
方法切换到指定的iframe。这个方法接受多种参数,包括iframe的索引、iframe的name或id属性,或者直接传入iframe的WebElement对象。from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") # 方法1:通过索引切换到第一个iframe driver.switch_to.frame(0) # 方法2:通过iframe的name或id属性切换到指定iframe driver.switch_to.frame("iframe_name_or_id") # 方法3:通过WebElement对象切换到指定iframe iframe_element = driver.find_element_by_id("iframe_id") driver.switch_to.frame(iframe_element)
-
在iframe中操作元素: 一旦切换到了iframe,就可以在其中执行普通的Selenium元素定位和操作了。
# 在iframe中找到元素并进行操作 element_inside_iframe = driver.find_element_by_id("element_id_inside_iframe") element_inside_iframe.click()
-
切回主文档: 在完成iframe内的操作后,需要切回到主文档,以便在主文档中执行其他操作。
# 切回主文档 driver.switch_to.default_content()
注意:
switch_to.default_content()
将焦点切回到最外层的文档,不再处于任何iframe中。 -
嵌套iframe的处理: 如果页面中存在多层嵌套的iframe,需要多次使用
switch_to.frame()
切换到正确的iframe。driver.switch_to.frame(0) # 进入第一层iframe driver.switch_to.frame("nested_iframe_name") # 进入第二层iframe # 在第二层iframe中执行操作 driver.switch_to.default_content() # 切回主文档
2.3 显示等待和隐式等待
1.显示等待(Explicit Waits):
显示等待是指在代码中明确指定某个条件并等待直到该条件成立,然后再继续执行后续的代码。这种等待方式在特定条件满足或超时之前会一直等待。
在Selenium中,可以使用WebDriverWait
类结合条件类(如expected_conditions
)来实现显示等待。
示例:
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://example.com")
# 显示等待,等待元素可见
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "example_id"))
)
# 在元素可见后执行操作
element.click()
在上面的示例中,WebDriverWait
类等待最多10秒,直到元素具有可见性,然后执行后续操作。
2.隐式等待(Implicit Waits):
隐式等待是指在查找元素时,如果没有立即找到,将等待一定的时间再次尝试查找。这个等待是全局的,对整个WebDriver的生命周期都有效。
示例:
from selenium import webdriver
driver = webdriver.Chrome()
# 设置隐式等待时间为10秒
driver.implicitly_wait(10)
# 在查找元素时,如果没有立即找到,将等待最多10秒
element = driver.find_element_by_id("example_id")
# 在元素找到后执行操作
element.click()
在上面的示例中,implicitly_wait(10)
设置了全局隐式等待时间为10秒。这意味着如果在查找元素时没有立即找到,将等待最多10秒再次尝试查找。
3.选择使用哪种等待方式:
- 显示等待通常更灵活,因为可以等待特定条件成立,而不仅仅是等待元素可见或存在。
- 隐式等待适用于整个测试过程中都需要等待的情况,但可能导致不精确的等待时间,因为它是全局的。