Selenium WebDriver提供By.CSS_SELECTOR定位元素方法

本文详细介绍了SeleniumWebDriver中使用By.CSS_SELECTOR进行元素定位的方法,包括各种CSS选择器类型及其示例,如标签选择器、类选择器、ID选择器等,以及如何结合这些选择器进行实际的页面元素操作和用户交互模拟。
摘要由CSDN通过智能技术生成

`By.CSS_SELECTOR` 是 Selenium WebDriver 提供的一种定位元素的方法,它允许使用 CSS 选择器来定位页面上的元素。以下是常见的 CSS 选择器语法:

1. **标签选择器(Tag Selector)**:通过元素的标签名选择元素。
   - 示例:`p` 选取所有 p 标签的元素。

2. **类选择器(Class Selector)**:通过元素的类名选择元素。
   - 示例:`.container` 选取所有类名为 container 的元素。

3. **ID 选择器(ID Selector)**:通过元素的 ID 属性选择元素。
   - 示例:`#my_div` 选取 ID 属性为 my_div 的元素。

4. **属性选择器(Attribute Selector)**:根据元素的属性值选择元素。
   - 示例:`[name='username']` 选取所有 name 属性值为 username 的元素。

5. **子元素选择器(Child Selector)**:选择指定元素的直接子元素。
   - 示例:`div > p` 选取所有直接子元素为 div 的 p 元素。

6. **后代元素选择器(Descendant Selector)**:选择指定元素的后代元素。
   - 示例:`div p` 选取所有 div 元素下的 p 元素。

7. **相邻兄弟选择器(Adjacent Sibling Selector)**:选择指定元素的相邻兄弟元素。
   - 示例:`h2 + p` 选取紧跟在 h2 元素后的第一个 p 元素。

8. **通用兄弟选择器(General Sibling Selector)**:选择指定元素的所有兄弟元素。
   - 示例:`h2 ~ p` 选取紧跟在 h2 元素后的所有 p 元素。

9. **伪类选择器(Pseudo-class Selector)**:根据元素的状态或位置选择元素。
   - 示例:`:hover` 选取鼠标悬停在元素上的状态。:nth-child(n) 选取父元素的第 n 个子元素。

10. **伪元素选择器(Pseudo-element Selector)**:选择元素的特定部分。
    - 示例:`::before` 选取元素的前面生成的内容。::after 选取元素的后面生成的内容。

11. **属性存在选择器:选择具有指定属性的元素。
    - 示例:input[type] 选取所有具有 type 属性的 input 元素。

以上是一些常见的 CSS 选择器语法,结合使用它们可以实现灵活且精准的元素定位。

`By.CSS_SELECTOR` 定位元素并模拟用户与页面元素的交互的完整示例代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 启动 Chrome 浏览器
driver = webdriver.Chrome()

# 打开页面
driver.get("data:text/html;charset=utf-8," + """
<div id="my_div" class="container">
    <H4>type、press 和 check 方法来模拟用户与页面元素的交互操作</H4>
    <p>Paragraph 1</p>
    <p>Paragraph 2</p>
    <p>Paragraph 3</p>
    <label for="my_input">my_input :<input type="text" id="my_input"></label><BR><BR>
    <button id="my_button">Click Me</button>
    <input type="checkbox" id="my_checkbox">
    <form action="/submit">
        <!-- 复选框 -->
        <label for="checkbox1">选项1:</label>
        <input type="checkbox" id="checkbox1" name="option1" value="Option 1">
        
        <label for="checkbox2">选项2:</label>
        <input type="checkbox" id="checkbox2" name="option2" value="Option 2">
        
        <!-- 下拉框 -->
        <label for="dropdown">选择一项:</label>
        <select id="dropdown" name="dropdown">
            <option value="option1">选项1</option>
            <option value="option2">选项2</option>
            <option value="option3">选项3</option>
        </select>
        
        <input type="submit" value="提交">
    </form>
</div>
""")

# 使用 CSS 选择器定位元素并模拟用户与页面元素的交互
# 输入文本
driver.find_element(By.CSS_SELECTOR, "input#my_input").send_keys("Hello, World!")

# 点击按钮
driver.find_element(By.CSS_SELECTOR, "button#my_button").click()

# 勾选复选框
driver.find_element(By.CSS_SELECTOR, "input#my_checkbox").click()

# 选择下拉框选项
driver.find_element(By.CSS_SELECTOR, "select#dropdown option[value='option2']").click()

# 提交表单
driver.find_element(By.CSS_SELECTOR, "input[type='submit']").click()

time.sleep(5)
# 关闭浏览器
driver.quit()

# find_element(by, value) 方法是 WebDriver 类对象中用于查找单个页面元素的方法。它接受两个参数:
# by: 指定定位元素的方法,可以是以下之一:
# By.ID: 使用元素的 id 属性来定位。
# By.NAME: 使用元素的 name 属性来定位。
# By.XPATH: 使用 XPath 表达式来定位。
# By.LINK_TEXT: 使用链接文本来定位 <a> 元素。
# By.PARTIAL_LINK_TEXT: 使用部分链接文本来定位 <a> 元素。
# By.TAG_NAME: 使用标签名称来定位。
# By.CLASS_NAME: 使用 class 属性来定位。
# By.CSS_SELECTOR: 使用 CSS 选择器来定位。
# value: 定位方法对应的值,即要定位的元素的具体标识信息。
# 该方法会返回匹配的第一个元素,如果找不到匹配的元素,会抛出 NoSuchElementException 异常。

# `By.CSS_SELECTOR` 是 Selenium WebDriver 提供的一种定位元素的方法,它允许使用 CSS 选择器来定位页面上的元素。
# 以下是常见的 CSS 选择器语法:
# 1. **标签选择器(Tag Selector)**:通过元素的标签名选择元素。
#    - 示例:`p` 选取所有 p 标签的元素。
# 2. **类选择器(Class Selector)**:通过元素的类名选择元素。
#    - 示例:`.container` 选取所有类名为 container 的元素。
# 3. **ID 选择器(ID Selector)**:通过元素的 ID 属性选择元素。
#    - 示例:`#my_div` 选取 ID 属性为 my_div 的元素。
# 4. **属性选择器(Attribute Selector)**:根据元素的属性值选择元素。
#    - 示例:`[name='username']` 选取所有 name 属性值为 username 的元素。
# 5. **子元素选择器(Child Selector)**:选择指定元素的直接子元素。
#    - 示例:`div > p` 选取所有直接子元素为 div 的 p 元素。
# 6. **后代元素选择器(Descendant Selector)**:选择指定元素的后代元素。
#    - 示例:`div p` 选取所有 div 元素下的 p 元素。
# 7. **相邻兄弟选择器(Adjacent Sibling Selector)**:选择指定元素的相邻兄弟元素。
#    - 示例:`h2 + p` 选取紧跟在 h2 元素后的第一个 p 元素。
# 8. **通用兄弟选择器(General Sibling Selector)**:选择指定元素的所有兄弟元素。
#    - 示例:`h2 ~ p` 选取紧跟在 h2 元素后的所有 p 元素。
# 9. **伪类选择器(Pseudo-class Selector)**:根据元素的状态或位置选择元素。
#    - 示例:`:hover` 选取鼠标悬停在元素上的状态。:nth-child(n) 选取父元素的第 n 个子元素。
# 10. **伪元素选择器(Pseudo-element Selector)**:选择元素的特定部分。
#     - 示例:`::before` 选取元素的前面生成的内容。::after 选取元素的后面生成的内容。
# 11. **属性存在选择器:选择具有指定属性的元素。
#     - 示例:input[type] 选取所有具有 type 属性的 input 元素。

# 以上是一些常见的 CSS 选择器语法,结合使用它们可以实现灵活且精准的元素定位。

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这段代码存在以下问题: 1. 密码明文存储:将密码明文写在代码中,存在安全隐患,建议使用配置文件或者环境变量等方式进行存储和读取。 2. 显式等待时间过长:在等待登录后获取用户信息时,使用了 `time.sleep(15)` 进行等待,建议使用显式等待的方式进行等待,可以更加准确地等待元素出现。 3. 代码可读性差:代码结构不清晰,建议使用函数或者类等方式对代码进行组织,提高可读性和可维护性。 4. 代码复用性差:在获取登录的cookie数据时,将数据直接写入文件中,不方便在其他地方进行复用,建议将数据返回给调用方进行处理。 5. 代码健壮性差:没有对获取元素和等待元素出现等操作进行异常处理,可能会因为元素未找到或者等待超时等问题导致程序崩溃。 针对这些问题,可以进行如下调整: ```python import json from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from utils import create_chrome_driver def login(username, password): browser = create_chrome_driver() try: browser.get('https://login.taobao.com') # 隐式等待 browser.implicitly_wait(10) # 获取页面元素模拟用户输入和点击行为 username_input = browser.find_element(By.CSS_SELECTOR, '#fm-login-id') username_input.send_keys(username) # 填写用户名 password_input = browser.find_element(By.CSS_SELECTOR, '#fm-login-password') password_input.send_keys(password) # 填写对应的密码 # 登录按钮 login_button = browser.find_element(By.CSS_SELECTOR, '#login-form > div.fm-btn > button') login_button.click() # 显式等待 wait_obj = WebDriverWait(browser, 10) wait_obj.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.m-userinfo'))) # 获取登录的cookie数据,并返回给调用方 cookies = browser.get_cookies() return cookies finally: browser.quit() ``` 这个函数可以接收用户名和密码作为参数,并返回登录后的cookie数据,同时加入了异常处理等机制,提高了代码的健壮性和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值