selenium页面元素定位、操作

这篇具有很好参考价值的文章主要介绍了selenium页面元素定位、操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  
1、通过页面开发者工具(点击键盘F12或者空白处右击点击检查)中的element,查看页面html代码;
2、点击开发者工具左上角鼠标按钮;
3、鼠标移动至需要定位元素位置;
4、高亮显示;
5、右击选择定位方式。
selenium页面元素定位、操作

1 打开 / 关闭浏览器

from selenium import webdriver
import time
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
url = 'https://www.csdn.net/'
browser.get(url)
browser.maximize_window()
time.sleep(5)
# browser.close() 
browser.quit() 

注意:
关闭浏览器close和quit的区别:
以下是两个函数的描述,可见close() 只关闭当前窗口;quit() 退出驱动程序并关闭所有相关窗口。

    def close(self) -> None:
        """
        Closes the current window.

        :Usage:
            ::

                driver.close()
        """
        self.execute(Command.CLOSE)

    def quit(self) -> None:
        """
        Quits the driver and closes every associated window.

        :Usage:
            ::

                driver.quit()
        """
        try:
            self.execute(Command.QUIT)
        finally:
            self.stop_client()
            self.command_executor.close()

2 打开URL链接

browser = webdriver.Chrome()
browser.get('https://www.csdn.net/')
browser.maximize_window()
time.sleep(5)
browser.quit()

3 定位单个页面元素

  使用find_element函数来定位元素。

3.1 通过ID定位

  id值在一个页面中是唯一的。

browser = webdriver.Chrome()
browser.get('https://www.csdn.net/')
browser.maximize_window()
time.sleep(5)
browser.find_element(By.ID, "toolbar-search-input").send_keys("python")
time.sleep(5)
browser.find_element(By.ID, "toolbar-search-button").click()
time.sleep(5)
browser.quit()
3.2 通过name定位

  name属性在同一个表单中唯一,但在页面不唯一。若有两个name属性相同的元素,使用该方法会定位到name属性第一次出现的地方。
selenium页面元素定位、操作

browser.find_element(By.NAME, "username").click()
3.3 通过classname定位

  class属性同样不唯一,页面中可能会出现多个,使用该方法定位到的也是第一个拥有该class属性的元素。
selenium页面元素定位、操作

browser.find_element(By.CLASS_NAME, "blog-nav-box").click()
3.4 通过CSS定位

  传入的参数格式:标签名[属性名=属性值],通过标签与属性的组合来唯一的定位页面元素

browser.find_element(By.CSS_SELECTOR, "input[id='toolbar-search-input']").click()
3.5 通过链接的文本信息定位

  这种方法只适合定位链接元素

browser.find_element(By.By.LINK_TEXT, "Python").click()
3.6 通过XPath定位
browser = webdriver.Chrome()
browser.get('https://www.csdn.net/')
browser.maximize_window()
browser.find_element(By.XPATH, '//*[@id="csdn-toolbar"]/div/div/div[3]/div/div[3]/a').click()
browser.find_element(By.XPATH, '//*[@id="toolbar-search-input"]').send_keys("人工智能")
browser.find_element(By.XPATH, '//*[@id="toolbar-search-button"]').click()
time.sleep(5)
browser.quit()
3.6.1 xpath语法
/ 表示一个层级,从根节点开始定位(绝对路径)
// 表示多个层级,从任意位置开始定位
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
* 匹配任何元素节点
//* 选取文档中的所有元素
@* 匹配任何属性节点
//title[@*] 选取所有带有属性的title元素
3.6.2 实例
/div/div[3] 选取div下的第三个div的元素
//div 选取所有div元素,不管他们在文档中的位置
div//title 选取div元素的后代的所有title元素
//@lang 选取名为lang的所有属性
//title[@lang='eng] 选取所有title元素,并且带有值为eng的lang属性
//div|//title 选取文档中的所有div和title元素

4 操作

4.1 基本操作
# 清除文本框内容:使用clear()方法
browser.find_element(By.XPATH, '//*[@id="toolbar-search-input"]').clear() 
# 点击
browser.find_element(By.XPATH, '//*[@id="toolbar-search-button"]').click()  
# 填写文本内容
browser.find_element(By.XPATH, '//*[@id="toolbar-search-input"]').send_keys("人工智能") 
# 获取元素的属性信息:使用get_attribute(“属性名”)
browser.find_element(by, element_value).get_attribute('value') 
4.2 切换窗口、框架
 # 切换fram框架, "frame_value"可以是id、name属性值,也可以是序号index,假如有2个iframe
 # 第一个序号就是0
browser.switch_to.frame(frame_value)

# 切换窗口
handles = browser.window_handles # 获取当前全部窗口句柄集合
now_handle = driver.current_window_handle # 获取当前窗口句柄
browser.switch_to.window(now_handle) # 切换至当前窗口

# 切换alert
# accept - 点击【确认】按钮
# dismiss - 点击【取消】按钮(如有按钮)
# send_keys - 输入内容(如有输入框)
alert = switch_to.alert().accept()    #点击确认

5 封装selenium的基本操作

def open_browser0(public_devices):
    """
    打开浏览器------无头模式
    :param public_devices:
    """
    global browser
    ch_options = Options()
    ch_options.add_argument("--headless")  # 为chrome设置无头模式 options=ch_options
    public_devices.driver = webdriver.Chrome()
    log.info("打开浏览器:%s" % public_devices.driver)
    browser = public_devices.driver
    browser.get("http://%s" % public_devices.path)
    log.info("get_url: %s" % public_devices.path)
    browser.maximize_window()
    time.sleep(2)
    
def close_browser():
    """
    logout,并关闭浏览器
    """
    global browser
    browser.quit()
    log.info("关闭浏览器")

@exist
def logout(element_value, element_type):
    """
    退出登录
    """
    global browser
    alert_prencence()
    res = browser.switch_to.default_content()
    log.info("切换至默认frame")
    click_element_by(element_value, element_type)
    log.info("退出登录")

def execute(cmd):
    """
    执行命令
    :param cmd:
    """
    global browser
    log.info(browser.execute(cmd))

def refresh():
    """
    刷新页面
    """
    global browser
    browser.refresh()
    log.info("刷新页面")
    time.sleep(2)

@exist
def check_element(node_element):
    """
    判断用户是否可见该节点元素
    :param node_element:
    :return:
    """
    if node_element.is_displayed():
        return True
    else:
        return False

def switch_to_frame(frame_value):
    """
    切换fame
    :param frame_value:
    """
    global browser
    browser.switch_to.frame(frame_value)
    log.info("切换frame到:%s" % frame_value)

def switch_to_window(window_value, window_type):
    """
    切换浏览器窗口
    :param window_value:
    :param window_type:
    """
    global browser
    handles = browser.window_handles
    log.info(browser.switch_to.window(handles[window_value]))

@exist
def set_element_text(element_value, set_value, element_type):
    """
    输入框输入
    :param element_value:元素定位
    :param set_value:要设置的值
    :param element_type:元素类型,支持id、xpath、link_text、partial_link_text、name、tag_name、class_name、css_selector
    """
    global browser
    by = whichType(element_type)
    browser.find_element(by, element_value).send_keys(set_value)
    log.info("输入:%s", set_value)
    time.sleep(2)

@exist
def clear_element_text(element_value, element_type='XPATH'):
    """
    清空输入框
    :param element_value:元素定位
    :param element_type:元素类型,支持id、xpath、link_text、partial_link_text、name、tag_name、class_name、css_selector
    """
    global browser
    by = whichType(element_type)
    log.info(browser.find_element(by, element_value).clear())
    time.sleep(2)

@exist
def get_text(element_value, element_type):
    """
    获取元素,并打印
    :param element_value:元素定位
    :param element_type:元素类型,支持id、xpath、link_text、partial_link_text、name、tag_name、class_name、css_selector
    """
    global browser
    by = whichType(element_type)
    element = browser.find_elements(by, element_value)
    res = element.__getattribute__('text')
    log.info("获取元素", res)
    return res

@exist
def get_element_attribute(element_value, element_type):
    """
    获取元素属性并返回
    :param element_value:元素定位
    :param element_type:元素类型,支持id、xpath、link_text、partial_link_text、name、tag_name、class_name、css_selector
    :return:
    """
    global browser
    by = whichType(element_type)
    attribute = browser.find_element(by, element_value).get_attribute('value')
    log.info("获取元素属性:%s", attribute)
    return attribute


@exist
def click_element_by(element_value, element_type):
    """
    点击元素
    :param element_value:元素定位
    :param element_type:元素类型,支持id、xpath、link_text、partial_link_text、name、tag_name、class_name、css_selector
    """
    global browser
    by = whichType(element_type)
    log.info("点击元素 %s", element_value)
    browser.find_element(by, element_value).click()
    time.sleep(2)


def alert_prencence():
    result = EC.alert_is_present()(browser)
    if result:
        log.info(result.text)
        result.accept()
    else:
        log.info("未弹出!")

6 判断元素是否存在

  通过添加装饰器,不改变原函数代码、不改变函数返回值,判断元素是否存在。文章来源地址https://www.toymoban.com/news/detail-403386.html

def exist(func):
    """
    装饰器,判断元素是否存在
    :param func:需要判断元素的函数
    :return:函数
    """
    global browser
    def wrapper(*args, **kwargs):
        keys = inspect.signature(func).parameters  # 得到的是不可迭代对象
        keys_str = str(keys)
        if keys_str.find('element_type') >= 0 and keys_str.find('element_value') >= 0:
            # 变成list后,可根据索引获取参数名对应的参数值
            keys_lis = list(keys)
            index_type = keys_lis.index("element_type") # 获取元素类型索引
            index_value = keys_lis.index("element_value") # 获取元素值索引
            element_type = whichType(args[index_type]) # 取对应索引参数值
            element_value = args[index_value] 
        try:
            WebDriverWait(browser, 5, 0.5).until(EC.presence_of_element_located((element_type, element_value)))
            return func(*args, **kwargs)
        except TimeoutException as e:
            log.error("timeout")
            raise ElementnotFoundException(element_type, element_value)
    return wrapper

class ElementnotFoundException(Exception):
    """
    自定义异常
    :param
    :return:字符串
    """

    def __init__(self, element_type, element_value):
        self.element_type = element_type
        self.element_value = element_value

    def __str__(self):
        log.error("\n找不到元素: %s" % self.element_value)
        # return "\n找不到元素: %s" % self.element_value

到了这里,关于selenium页面元素定位、操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • selenium通过xpath定位text换行的元素

    DOM元素(该元素是换行的,不能通过普通xpath定位):  可使用下面xpath定位该div 解释一下就是:定位“ 子节点的text是[5] 且 子节点弟弟的text是[点] ”的div

    2024年02月11日
    浏览(28)
  • selenium元素定位与操作

    说明:本篇博客基于selenium 4.1.0 在selenium中,想要对元素进行操作,一般需要如下步骤: 在浏览器中查看元素属性,便于selenium在页面中找到该元素 在代码中创建元素对象 元素操作、获取元素信息 方法1:右键-检查 方法2:设置-更多工具-开发者模式 方法3:默认快捷键F12 出

    2024年02月15日
    浏览(12)
  • selenium【元素定位与操作】

    定位元素 [@属性=‘属性值’] [@属性] [tag] [text()=‘文本’] 返回的是元素两个间的文本 [contains(text(),“元素两个间的部分文本”)] [contains(@属性名,“部分属性值”)] 定位下拉列表的某个选项:driver.find_element(By.XPATH,‘//option[text()=“联想”]’) driver.find_element(By.XPATH,‘//o

    2024年04月18日
    浏览(21)
  • 【Python】Python 模块用法:selenium 4 版本页面元素定位方法汇总

    目录 一、定位页面元素方法源码说明  (1)Webdriver.common (2)selenium.webdriver.common.by (3)By 二、定位页面元素方法用法汇总 (1)2.0 及以下低版本 selenium :By 定位页面元素方法用法(可忽略) (2)3.0 ~ 3.9 版本 selenium:By 定位页面元素方法用法 (3)4.0 ~ 4.9 版本 selenium:

    2023年04月13日
    浏览(28)
  • 【深入浅出Selenium库的百变玩法】: 掌握Web自动化测试的关键技术和策略,包括元素定位、页面操作、动态内容处理等,适用于初学者和高级开发者的综合指南

    Selenium是一个功能强大的库,支持多种高级操作,如处理多窗口、多标签页、键盘与鼠标事件、滚动操作等。掌握Selenium可以大大提高Web应用的测试效率和覆盖范围。希望这篇文章能帮助你开启Selenium进行自动化测试的新篇章。 Selenium也是一个广泛使用的自动化测试工具,它支

    2024年02月20日
    浏览(14)
  • selenium元素定位方式及常用操作

    要想操作一个对象,首先应该识别这个对象。 定位方式有很多,但是要保证这种方式存在,且能够唯一的定位到这个元素。 1、用 id 来定位 优先选择 ※ 首先在 Chrome 浏览器上把鼠标放到搜索框,鼠标右击选择开发者模式(快捷键:f12),查看对应 id 名 2、用 name 来定位 在开

    2024年02月02日
    浏览(16)
  • selenium新版元素定位方法、元素操作与基本API

    注意:selenium新版元素定位需要导入方法By,使用By来调用元素定位方法     from selenium.webdriver.common.by import By     标签的 id属性具有唯一性,就像人的身份证,不存在根据一个id属性定位到多个标签的情况。假设有个iframe标签如下,其 id 属性值为\\\"actionFrame\\\"。 我们可以通过

    2024年02月03日
    浏览(11)
  • (三) selenium元素定位和常用操作(下)

    上一篇:(二) selenium元素定位(上)_要开朗的spookypop的博客-CSDN博客 本篇继续介绍常用的元素定位和常用操作。 通过链接文本定位 alerts弹窗 浏览器窗口操作 1、通过链接文本定位 上图是一个返回首页的链接,点击后跳转到首页,元素定位关键代码: driver.find_element(By.LINK_TEXT,

    2024年02月11日
    浏览(15)
  • selenium定位元素(包括父子,兄弟)及常见操作

    id定位:find_element_by_id() name定位:find_element_by_name() class定位:find_element_by_class_name() link定位:find_element_by_link_text() partial link定位:find_element_by_partial_link_text() tag定位:find_element_by_tag_name() xpath定位:find_element_by_xpath() css定位:find_element_by_css_selector() .表示当前节点,…表示父

    2023年04月08日
    浏览(13)
  • selenium不定位元素直接使用键盘操作(如弹框操作)

    今天在使用selenium进行定位时,发现直接定位不了chrome的弹框,如这种弹框: 使用的是下面这行代码 运行报错,说是没有 alert windown。。。。 啊?难道chrome的弹框不是用alert写的?emmm……还真是,现在很少使用alert这种原生弹框了,多多少少都会自己封装下,然后就……全网

    2024年02月08日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包