当前位置: 首页 > news >正文

selenium元素定位

   当我们可以打开浏览器后我们如果想要进行web测试我们自然要对网页的一些功能进行单独拿出来进行测试,但是我们要怎么才能拿到我们想要的元素,并且对其进行操作呢。

    我们就以百度主页的输入框为例,如果我们想要王输入框中输入一些内容我们就需要通过html定位到输入框的位置。

    通常我们最常用也是最方便的一种方式就是通过id进行元素定位,下面我们来进行实现一些案例,假设我们想要输入“测试”,我们可以通过下述用例方式:

通过ID定位:

 

import timefrom selenium import webdriver
from selenium.webdriver.common.by import By#打开浏览器
driver = webdriver.Chrome()
# driver.implicitly_wait(2)
#进入百度主页
driver.get("https://www.baidu.com")
#通过id定位输入框位置
element = driver.find_element(By.ID,'kw')
#输入元素
element.send_keys("测试")
#Exception managing chrome: error decoding response body
time.sleep(2)
#关闭浏览器
driver.close()

     这里我们通过driver.find_element()这个方法来通过By.ID通过id这个属性来确定html的位置,当然我们还有其他的方法确定html的位置,查找到html的位置后会返回一个对象WebElement我们通常命名为element是WebElement的实例,这个类是Selenium用来表示html的核心对象,通过这个对象我们可以对网页上的元素进行各类操作。

       由于我们已经通过ID查找到了html的具体位置,通过send_keys()将想要的内容传入输入框。当然我们再输入“测试”后单击进行搜索,我们仍然可以通过id定位按钮的html位置然后进行click()之后就和我们正常用的搜索相同了。 

  但是需要特别注意的是虽然一般情况下ID是唯一的但是也会出现“意外”,也会有些代码不遵守这种默认的规则,此时我们就需要利用其他的方式完成我们的目标。

通过By.NAME定位:

    在百度输入框中我们也可以看到name这个属性,我们也可以通过name完成上述操作,输入“测试”。

 


import timefrom selenium import webdriver
from selenium.webdriver.common.by import By#打开浏览器
driver = webdriver.Chrome()
# driver.implicitly_wait(2)
#进入百度主页
driver.get("https://www.baidu.com")
#通过id定位输入框位置
# element = driver.find_element(By.ID,'kw')
#输入元素
element = driver.find_element(By.NAME,'wd')element.send_keys("测试")
#Exception managing chrome: error decoding response body
time.sleep(2)
#关闭浏览器
driver.close()

 由此可见我们通过name属性仍然完成了上述操作。

通过TAG_NAME定位:

  这种定位方式是通过标签进行定位,我们可以通过这种定位获取到对应标签下的所有信息并且我们可以将这些信息进行打印,假如我们要获取到div标签下的所有信息,例如:

  

import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
from sqlalchemy.sql.base import elements#打开浏览器
driver = webdriver.Chrome()
#进入百度主页
driver.get("https://www.baidu.com")elements = driver.find_element(By.TAG_NAME,'div')
for element in elements:print(element)#关闭浏览器
driver.close()

  理论上来说。通过这种方式,我们可以获取到div标签上的所有信息,但是如果我们运行这段代码我们会发现不会输出任何内容,这是因为我们访问某个网页时,如果数据还未加载此时我们就使用TAG_NAME定位,由于此时还没有数据,因此返回值可能是none。但是这种解决的方式也非常简单,没时间加载数据那我们就给它时间,我们此处可以使用time.sleep()设置等待的时间,但是我们要注意的是多长时间才算长呢?如果时间过长会造成资源的浪费,时间太短数据加载不完全,因此Selenium给我们提供了一种方式(等待元素),让我们能解决这个问题,driver.implicitly_wait()方法,这种方式可以设置全局的隐式等待时间,当查找元素时,如果元素未被找到,会不断地在指定时间进行查找,直到超时或元素被找到。

  等待元素的使用也非常简单,只需要在进入页面后加入这个方法就行,如果熟练使用了之后我们每一次进行web测试都会默认添加implicitly_wait()方法。

  如果是正常运行的话通过这种方式获取的结果应为:

通过By.CLASS_NAME定位:

  在这里统统class_NAME进行定位置时我们需要特别注意,class_name属性进行定位适用于类名唯一的元素。使用方法同上述方法基本相同。

import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
from sqlalchemy.sql.base import elements#打开浏览器
driver = webdriver.Chrome()
#进入百度主页
driver.get("https://www.baidu.com")
driver.implicitly_wait(2)
element = driver.find_element(By.CLASS_NAME,'s_ipt')
element.send_keys("测试")
time.sleep(2)
#关闭浏览器
driver.close()

  我们也可以通过这种方式,进行输入框的输入。 

通过By.LINK_TEXT定位:

   这种定位仅支持<a>标签并且文本内容必须完全一致,包括大小写和空格,即使其他标签包含相同的文本,也不会进行匹配,例如:

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
import time# 初始化浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)  # 设置隐式等待时间try:# 步骤 1: 打开百度首页driver.get("https://www.baidu.com")print("成功打开百度首页")# 步骤 2: 使用 By.LINK_TEXT 定位"新闻"链接news_link = driver.find_element(By.LINK_TEXT, "新闻")# 验证链接文本和 href 属性                                    用于获取html的属性值print(f"找到链接: 文本='{news_link.text}', href='{news_link.get_attribute('href')}'")# 步骤 3: 点击"新闻"链接news_link.click()print("点击'新闻'链接")# 步骤 4: 等待并验证页面标题WebDriverWait(driver, 10).until(EC.title_contains("百度新闻"))current_title = driver.title()print(f"当前页面标题: {current_title}")print("验证结果: 页面成功跳转到百度新闻")# 步骤 5: 截图保存(可选)driver.save_screenshot("baidu_news.png")print("截图已保存为: baidu_news.png")except Exception as e:print(f"测试失败: {e}")# 出错时截图driver.save_screenshot("error.png")
finally:# 等待 3 秒以便查看结果time.sleep(3)# 关闭浏览器driver.quit()print("测试完成,浏览器已关闭")

  通过这种方式我们就可以通过文本内容获取到<a>标签中的一些属性如超链接等。 

 

相关文章:

  • 【软考高项论文】论信息系统项目的整体管理
  • JVM 之双亲委派机制与打破双亲委派
  • C语言---常见的字符函数和字符串函数介绍
  • Spring Cloud 微服务架构模型
  • Linux内核网络协议栈深度解析:面向连接的INET套接字实现
  • AI 在金融领域的落地实践:从智能风控到量化交易的技术突破与案例解析
  • C++入门(笔记)
  • Everything
  • 笔记06:DXF导入后板框的定义
  • ASProxy64.dll导致jetbrains家的IDE都无法打开。
  • Re--攻防世界-基础android
  • Linux基本命令篇 —— less命令
  • Foundry测试实战:解锁区块链测试新姿势
  • 战神授权后台报错:Parse error: syntax error, unexpected end of file in解决办法
  • 【LLIE专题】EnlightenGAN 无监督低照度图像增强
  • Flutter基础(Riverpod)
  • Infineon AURIX TriCore TC3xx芯片内存专题报告
  • YOLOv8模型在RDK5开发板上的部署指南:.pt到.bin转换与优化实践
  • 【论文阅读笔记】知网SCI——基于主成分分析的空间外差干涉数据校正研究
  • c#激光设备行业ERP软件进销存软件库存管理软件财务管理软件