selenuim提供八种元素定位方式
1. id
2.name
3.class_name (使用元素的class属性定位)
4.tag_name (标签名称<标签名 ...../>)
5.link_text (定位超链接 a标签)
6.partial_link_text (定位超链接 a标签 模糊)
7.XPath (基于元素路径)
8.CSS _selector (基于元素选择器)
id、name、class三种元素定位方式使用方法相同 区别如下:
id:一般为唯一标识符
name:可以重名
class:多个命名
Xpath和CSS定位在F12中定位元素后可右键直接复制
find_element和find_elements的区别
1. 对于find_element()的使用,他需要传入2个参数,查找方式by和值,如find_element_by_id("name")等价于find_element(By.id,'name') 习惯上写第一种
但是find_element()只会查找页面中符合条件的第一个节点,并返回
2. 如果查找的目标在网页中只有一个,那么完全可以用find_element(),但如果有多个满足要求的节点,用find_element()就只能得到第一个节点了,所以查找多个节点时,应该使用find_elements()更好.
3. 1.只查找一个元素的时候:可以使用find_element(),find_elements()
find_element()会返回一个WebElement节点对象,但是没找到会报错,而find_elements()不会,之后返回一个空列表
2.查找多个元素的时候:只能用find_elements(),返回一个列表,列表里的元素全是WebElement节点对象
3.找到都是节点(标签)
4.如果想要获取相关内容(只对find_element()有效,列表对象没有这个属性) 使用 .text;
5.如果想要获取相关属性的值(如href对应的链接等,只对find_element()有效,列表对象没有这个属性):使用 .get_attribute("href")
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
def test_eight_components():
driver = webdriver.Edge()
driver.get("https://www.selenium.dev/selenium/web/web-form.html")
title = driver.title
assert title == "Web form"
driver.implicitly_wait(0.5)
# text_box = driver.find_element(by=By.NAME, value="my-text").send_keys("输入一个Selenium")
# textarea_text=driver.find_element(By.XPATH,value="/html/body/main/div/form/div/div[1]/label[3]/textarea").send_keys("这是一个富文本")
# 密码框输入在使用selenium时可能无法输入 需要使用插件
elements=driver.find_elements(By.TAG_NAME,value="input")
#返回所有标签为input的集合
print(len(elements))
print(elements)
print(type(elements))
#elements[1].send_keys("哈哈哈哈") 下标定位
for el in elements:
el.send_keys("我是一个富文本框")
print("输入成功")
submit_button = driver.find_element(by=By.CSS_SELECTOR, value="button").click()
value = driver.find_element(by=By.ID, value="message").text
# .text 用于获取文本信息
assert value == "Received!"
#assert函数 在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行时崩溃,不如在出现错误条件时就崩溃
# 这里如果value == "Received!"是错误语句 程序就会报错
sleep(100)
driver.quit()
test_eight_components()