selenium获取form表单元素

第一种:直接获取表单内div元素

获取一个

标签内所有
元素的数据,可以通过以下步骤实现这一功能:

1.启动Selenium WebDriver:首先,确保你已经安装了Selenium库和相应的WebDriver(例如ChromeDriver或GeckoDriver)。

2.定位到表单:使用Selenium的find_element_by_方法定位到包含

元素的。

3.查找所有

元素:在定位到的元素内部,使用适当的方法查找所有的
元素。

4.提取数据:遍历这些

元素,并提取你需要的数据。这可以通过元素的text属性、属性(如id、class等)或者进一步细化选择器来实现。

from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动WebDriver
driver = webdriver.Chrome(executable_path='path/to/chromedriver')
# 打开网页
driver.get('http://example.com')
# 定位到表单
form = driver.find_element(By.ID, 'form_id')  # 假设表单有一个ID为'form_id'
# 在表单内查找所有div元素
div_elements = form.find_elements(By.TAG_NAME, 'div')
# 提取每个div的数据
div_data = []
for div in div_elements:
    # 例如,提取div的文本内容
    text = div.text
    # 你可以根据需要提取更多信息,例如属性值
    # attribute_value = div.get_attribute('some_attribute')
    div_data.append(text)  # 或者其他你需要的数据结构 
# 打印或使用提取的数据
print(div_data) 
# 关闭浏览器
driver.quit()

注意事项:

确保WebDriver的路径正确,并且与你的浏览器版本兼容。

根据你的网页结构调整定位器(如By.ID,By.CLASS_NAME,By.CSS_SELECTOR, By.XPATH等)来准确地找到表单和其中的

元素。

如果

元素内有嵌套的元素或结构复杂,你可能需要进一步细化选择器或使用更复杂的XPath/CSS Selector来精确获取数据。

使用text属性可以获取到元素的文本内容,如果需要其他属性(如id、class等),可以使用get_attribute('attribute_name')方法。

通过上述方法,你可以有效地从网页中的表单内提取所有

元素的数据。

第二种:获取form元素下的第一层
元素

你可以使用XPath选择器或者CSS选择器来实现。这里我将分别展示如何使用这两种方法。

使用XPath

XPath是一种在XML文档中查找信息的语言,同样适用于HTML文档。你可以使用XPath来选择特定路径下的元素。例如,如果你想选择元素下的所有直接子

元素,你可以使用以下代码:

from selenium import webdriver
# 启动浏览器
driver = webdriver.Chrome()
# 打开网页
driver.get('你的网页URL')
# 使用XPath选择下的所有直接子
form_divs = driver.find_elements_by_xpath("//form/div") # 打印每个div的文本内容(可选) for div in form_divs:     print(div.text) # 关闭浏览器 driver.quit()


使用CSS选择器

CSS选择器是另一种在HTML文档中选择元素的方法。对于直接子元素,你可以使用>选择器。例如,选择下的所有直接子

元素:

from selenium import webdriver 
# 启动浏览器
driver = webdriver.Chrome() 
# 打开网页
driver.get('你的网页URL')
# 使用CSS选择器选择下的所有直接子
form_divs = driver.find_elements_by_css_selector("form > div")  # 打印每个div的文本内容(可选) for div in form_divs:     print(div.text) # 关闭浏览器 driver.quit()

注意事项

确保你的Selenium WebDriver已经正确安装并配置了对应的浏览器驱动(ChromeDriver)。

替换'你的网页URL'为你要测试的网页的实际URL。

如果页面中包含多个元素,你可能需要指定一个更具体的XPath或CSS选择器来定位特定的元素。例如,如果你知道表单的ID或类名,可以使用//form[@id='some-id']/div或form.some-class > div。

以上就是如何使用Selenium获取元素下所有第一层的

元素的方法。

第三种:获取元素下的所有第二层
元素

要使用Selenium获取元素中所有第一层的

元素中嵌套的
元素,你可以先定位到元素,然后使用XPath或CSS选择器来选择这些嵌套的
元素。下面是一些示例方法来实现这一目标。

方法1:使用XPath

XPath是一种强大的工具,可以用于定位HTML文档中的节点。你可以使用XPath来选择特定层级的

元素。

from selenium import webdriver
 
# 启动浏览器
driver = webdriver.Chrome()
 
# 打开网页
driver.get('你的网页URL')
 
# 使用XPath选择form中的第一层div中的所有嵌套div
form_xpath = '//form//div/div'  # 选择form下的所有第一层div中的嵌套div
nested_divs = driver.find_elements_by_xpath(form_xpath)
 
# 打印或处理这些元素
for div in nested_divs:
    print(div.text)  # 例如,打印每个div的文本内容
 
# 关闭浏览器
driver.quit()

方法2:使用CSS选择器

CSS选择器也可以用来定位嵌套的

元素,特别是当你需要选择特定层级时。

from selenium import webdriver
 
# 启动浏览器
driver = webdriver.Chrome()
 
# 打开网页
driver.get('你的网页URL')
 
# 使用CSS选择器选择form中的第一层div中的所有嵌套div
form_css = 'form > div > div'  # 选择form下的所有第一层div中的嵌套div,注意这里的'>'表示直接子代关系
nested_divs = driver.find_elements_by_css_selector(form_css)
 
# 打印或处理这些元素
for div in nested_divs:
    print(div.text)  # 例如,打印每个div的文本内容
 
# 关闭浏览器
driver.quit()

注意事项:

XPath和CSS选择器的区别:XPath提供了更强的选择能力,特别是当你需要选择层级关系非常具体或复杂的元素时。而CSS选择器通常更简洁易读,但在处理复杂层级关系时可能需要更多的层级指示符(如> 直接子代选择器)。

确保定位准确:确保你的XPath或CSS选择器准确地反映了页面结构。如果页面结构复杂或有动态内容,可能需要调整选择器以适应最新的DOM结构。

等待元素加载:在实际应用中,可能需要使用WebDriverWait和expected_conditions来确保在尝试查找元素前,元素已经加载到DOM中。例如:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)  # 等待最多10秒
form = wait.until(EC.presence_of_element_located((By.TAG_NAME, 'form')))  # 确保form元素已加载

然后再进行元素的查找。

通过上述方法,你可以有效地定位并处理元素中特定层级的

元素。

最后测试一个表单内分布三个div,每个div内分别嵌套着不同span和label的实例代码:

def income():
    q1=Options()
    q1.add_argument('--no-sandbox')
    q1.add_experimental_option('detach',True)
    c1=webdriver.Chrome(service=Service("chromedriver.exe"),options=q1)
    c1.get('保密')
    c1.maximize_window()
    # 隐式等待
    c1.implicitly_wait(20)
    # c1.maximize_window()
    # 首页登录
    c1.find_element(By.NAME, 'username').send_keys('admin')
    c1.find_element(By.NAME, 'password').send_keys('ccc0000')
    c1.find_element(By.CLASS_NAME, 'btn-login').click()
    time.sleep(10)
    c1.find_element(By.ID, 'hamburger-container').click()
    time.sleep(5)
    # 点击标识下拉按钮
    b1 = c1.find_element(By.XPATH, '/html/body/div/div/div[1]/div[4]/div[1]/div[1]/div/ul/div[6]/li/div/i[2]')
    print(b1.text)
    b1.click()
    time.sleep(5)
    # 点击合同管理,跳转合同页面内
c1.find_element(By.XPATH,'/html/body/div[1]/div/div[1]/div[4]/div[1]/div[1]/div/ul/div[6]/li/ul/div[7]/a/li').click()
    # 定位表单
    form = c1.find_element(By.XPATH, '//*[@id="app"]/div/div/section/div/div/div/div/form')
    # 定位第一层的所有 div 元素(直接子元素)
    first_level_divs = form.find_elements(By.XPATH, '..//div[contains(@class, "el-row")]')  # 保持相对路径

    result = []

    # 遍历第一层的每个 div
    for first_div in first_level_divs:
        # 在第一层 div 内部查找所有可能的子容器
        second_level_divs = first_div.find_elements(By.XPATH,'.//div[contains(@class, "el-col")]')  # 模糊匹配 el-col-6 等列布局
        for container in second_level_divs:
            try:
                # 提取 label(通过包含特征文本的标签)
                label = container.find_element(By.XPATH, './/label')  # 根据你的字段关键词定位
                label_text = label.text.split("\n")[-1].strip()  # 去除图标文本,保留核心字段

                # 提取 span(通过 class="listMoney")
                span = container.find_element(By.CLASS_NAME, "listMoney")
                span_text = span.text.strip()

                result.append({"label": label_text, "value": span_text})
            except:
                continue  # 跳过无目标元素的容器

    # 打印结果
    for item in result:
        print(f"字段: {item['label']}, 金额: {item['value']}")

 

你可能感兴趣的:(selenium,测试,pycharm,selenium,测试工具)