当我们可以打开浏览器后我们如果想要进行web测试我们自然要对网页的一些功能进行单独拿出来进行测试,但是我们要怎么才能拿到我们想要的元素,并且对其进行操作呢。
我们就以百度主页的输入框为例,如果我们想要王输入框中输入一些内容我们就需要通过html定位到输入框的位置。
通常我们最常用也是最方便的一种方式就是通过id进行元素定位,下面我们来进行实现一些案例,假设我们想要输入“测试”,我们可以通过下述用例方式:
通过ID定位:
import time
from 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 time
from 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 time
from 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 time
from 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>标签中的一些属性如超链接等。