Selenium 是一个用于自动化 Web 浏览器的工具,它支持多种浏览器,并提供了一组功能强大的 API,用于在浏览器中模拟用户操作。通过使用 Selenium,你可以编写自动化脚本来执行各种 Web 测试任务,如测试 Web 应用程序的功能、性能和兼容性。
下面是使用 Selenium 进行自动化测试的一般步骤:
- 安装 Selenium 库:首先,你需要安装 Selenium 库。Selenium 提供了不同语言的客户端库,如 Python、Java、JavaScript 等,你可以根据自己的喜好选择合适的语言库进行安装。
- 选择浏览器驱动:Selenium 需要与浏览器驱动程序一起使用,以便控制浏览器。你需要下载并配置适合你使用的浏览器的驱动程序,比如 Chrome 的驱动程序为 ChromeDriver。
- 编写测试脚本:使用选定的编程语言编写测试脚本,通过 Selenium 提供的 API 来控制浏览器执行各种操作,如打开网页、点击按钮、填写表单等。
- 执行测试脚本:运行编写的测试脚本,Selenium 将自动打开浏览器并模拟用户操作。你可以观察测试执行过程,检查是否符合预期。
- 分析结果:执行完测试后,分析测试结果,查看是否出现错误或异常情况,从而改进和优化测试脚本。
python+selenium+phantomjs可以构成一个爬虫结构。
phantomjs负责渲染解析JavaScriptselenium负责驱动浏览器,和与python对接python负责后期处理
6.1.1.selenium的安装
(1)下载地址:
selenium · PyPI
(2)下载安装包:
![](https://img-blog.csdnimg.cn/direct/42eff57702d94eebb1126b92e7b205c8.png)
选择 selenium-4.18.1.tar.gz,进行下载
(3)将下载的安装包进行解压,然后在解压的目录下,执行该命令就行pip install selenium
或者可以在解压的目录下,执行python setup.py install。setup.py就在解压的根目录下。
6.1.2.例子
** 例1:使用百度检索**
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
# 启动 Edge 浏览器
driver = webdriver.Edge()
# 打开百度网页
driver.get("https://www.baidu.com")
# 定位搜索输入框并输入关键词
search_box = driver.find_element(By.NAME, "wd")
search_box.send_keys("爬虫")
# 模拟键盘回车,执行搜索
search_box.send_keys(Keys.RETURN)
# 等待搜索结果加载
driver.implicitly_wait(5) # 隐式等待 5 秒
# 输出搜索结果的标题
results = results = driver.find_elements(By.CSS_SELECTOR, "h3.t a")
for result in results:
print(result.text)
# 关闭当前标签页
driver.close()
在 Selenium 中,
find_element()
方法用于查找页面上符合条件的第一个元素。该方法接受两个参数:定位器(locator)和定位器的值(locator value)。
详细讲解下
find_element()
方法里面的参数:
- 定位器(locator):- 定位器指定了要查找的元素的类型或属性。在 Selenium 中,常用的定位器包括: -
By.ID
: 通过元素的 id 属性定位元素。-By.NAME
: 通过元素的 name 属性定位元素。-By.CLASS_NAME
: 通过元素的 class 属性定位元素。-By.TAG_NAME
: 通过元素的标签名定位元素。-By.XPATH
: 使用 XPath 表达式定位元素。-By.CSS_SELECTOR
: 使用 CSS 选择器定位元素。-By.LINK_TEXT
: 通过链接文本定位<a>
元素。-By.PARTIAL_LINK_TEXT
: 通过部分链接文本定位<a>
元素。 - 定位器的值(locator value):- 定位器的值是用来匹配页面上元素的具体信息,如 id 值、name 值、class 名称、XPath 表达式等,根据不同的定位器类型而异。
举例来说,
driver.find_element(By.NAME, "wd")
中的参数解释为:
- 定位器:
By.NAME
,表示通过元素的 name 属性进行定位。 - 定位器的值:
"wd"
,表示要查找的元素的 name 属性的值为 "wd"。
通过合理选择定位器和定位器的值,可以准确地定位到页面上的目标元素。这样就可以在自动化测试过程中与页面元素进行交互。
例2.向网易邮箱登录界面输入用户名
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
driver = webdriver.Edge()
driver.get("https://mail.163.com/")
# 切换到指定的 <iframe>,可以通过索引、名称、ID 或元素来定位
iframe = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe)
# 在 <iframe> 中等待并查找元素
wait = WebDriverWait(driver, 10)
username = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@name='email']")))
# 输入用户名
username.send_keys("123456")
# 切回主文档
driver.switch_to.default_content()
time.sleep(10)
# 关闭浏览器
driver.quit()
6.1.3.等待
有上面的第二个例子可以看出,等待的重要性,所以我们来了解下selenium的等待。
6.1.3.1.显式等待
其实也就是,**指定某一条件直到这个条件成立时才会继续执行**,可以设置超时时间,如果超过这个时间元素依然没被加载,就会执出异常。
6.1.2的第二个例子就是一个显式等待的例子。
主要通过【wait = WebDriverWait(driver, 10)】设定,10代表10秒。默认是500ms。
6.1.3.2.隐式等待
在6.1.2.的第二个例子的基础上,做稍微的修改。
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
driver = webdriver.Edge()
driver.implicitly_wait(10)
driver.get("https://mail.163.com/")
# 切换到指定的 <iframe>,可以通过索引、名称、ID 或元素来定位
iframe = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe)
# 在 <iframe> 中等待并查找元素
wait = WebDriverWait(driver, 10)
username = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@name='email']")))
# 输入用户名
username.send_keys("123456")
# 切回主文档
driver.switch_to.default_content()
time.sleep(10)
# 关闭浏览器
driver.quit()
追加一句【driver.implicitly_wait(10)】
implicitly_wait
方法被用来设置隐式等待时间为 10 秒。一旦设置了隐式等待时间,在之后的代码中,如果通过
find_element
等方法查找元素时没有立即找到,Selenium 将等待最多设定的时间,直到元素可用或超时。
**请注意,隐式等待会在整个 WebDriver 对象的生命周期内起作用,对所有的
find_element
和
find_elements
方法都有效。**
6.1.3.3.线程休眠
time.sleep(time),这是使用线程休眠延时的办法,也是比较常用的。
版权归原作者 sty3318 所有, 如有侵权,请联系我们删除。