Playwright中page.locator快速查找网页元素和对象交互操作

Playwright 是一个用于自动化测试和网页操作的 Python 库,它提供了对浏览器的控制和操作的功能,包括 Chromium、Firefox 和 WebKit。使用 Playwright,您可以编写自动化测试、网页截图、网页数据提取以及网页交互等任务。
Playwright 具有以下特点:
跨浏览器支持: 支持多种主流浏览器,包括 Chromium、Firefox 和 WebKit。

强大的 API: 提供了丰富的 API,允许您模拟用户操作、获取和修改网页内容、执行 JavaScript 等。
异步支持: 支持异步操作,可以更高效地管理并发任务。
自动等待和重试: 具有内置的自动等待和重试机制,使测试更稳定可靠。
Headless 和非 Headless 模式: 可以选择在 Headless 模式(无界面)或非 Headless 模式(有界面)下运行浏览器。

交互式调试: 提供交互式调试工具,方便定位和解决问题。
社区活跃: 由微软开发并开源,拥有活跃的社区支持和更新。
Python 的 Playwright 库提供了易于使用的 API,使得在 Python 中进行网页自动化变得简单而高效。您可以使用 Playwright 来执行各种任务,包括自动化测试、网页截图、网页爬取和数据提取等。

-----------------------------------
Playwright 中的`page.locator()`方法用于在网页上查找和交互操作。
它返回一个 Locator 对象该对象表示匹配指定选择器及任何额外约束(例如 has_text、has_not_text、has 和 has_not)的元素集合。
可以使用 Locator 对象在匹配元素上执行操作,例如点击按钮或填充表单字段。Locator 对象在执行操作之前立即解析为实际的 DOM 元素,因此如果在操作之间更改了 DOM 结构,则操作将在正确的元素上执行。
与其他用于查找元素的方法(如 query_selector_all)相比,locator 提供了更多高级功能,例如等待元素出现并检查它们是否可见。这可以使测试更加稳健和可维护。
此外,locator 允许您通过指定额外约束(例如 has_text 或 has)来缩小元素查找的范围。这在查找可能没有唯一选择器的特定元素时很有用。
总的来说,Playwright 中的 locator 方法是一个强大的工具,它允许开发人员轻松查找和与网页上的元素交互。使用 Playwright 时,建议使用 locator 查找元素。

下面是 `page.locator()` 方法的详细介绍:
page.locator(selector)
page.locator(selector, **kwargs)

### 语法

    def locator(
        self,
        selector: str,
        *,
        has_text: typing.Optional[typing.Union[str, typing.Pattern[str]]] = None,
        has_not_text: typing.Optional[typing.Union[str, typing.Pattern[str]]] = None,
        has: typing.Optional["Locator"] = None,
        has_not: typing.Optional["Locator"] = None
    ) -> "Locator":
        """Page.locator

### 参数

方法的第一个参数是selector,它是一个字符串,用于解析DOM元素。
该方法还接受可选的参数has_text、has_not_text、has和has_not。
has_text参数用于匹配包含指定文本的元素,该文本可能出现在元素的子元素或后代元素中。当传递一个字符串时,匹配是不区分大小写的,并搜索子字符串。例如,"Playwright"将匹配<article><div>Playwright</div></article>。
has_not_text参数用于匹配不包含指定文本的元素,该文本可能出现在元素的子元素或后代元素中。当传递一个字符串时,匹配是不区分大小写的,并搜索子字符串。
has参数用于限制方法的结果,仅包含与此相对定位器匹配的元素。例如,article,它有text=Playwright匹配<article><div>Playwright</div></article>。
has_not参数用于匹配不包含与内部定位器匹配的元素的元素。内部定位器查询与外部定位器匹配,而不是文档根。例如,您可以在<article><content><div>Playwright</div></content></article>中查找具有div的content。但是,查找具有article div的content将失败,因为内部定位器必须相对于外部定位器,不应使用外部定位器之外的任何元素。
请注意,外部和内部定位器必须属于同一框架。内部定位器不得包含FrameLocators。

### 返回值: 一个 Locator对象(元素定位器),可以用于查找与给定选择器匹配的元素。

    def locator(self,selector: str,*,has_text: typing.Optional[typing.Union[str, typing.Pattern[str]]] = None,has_not_text: typing.Optional[typing.Union[str, typing.Pattern[str]]] = None,has: typing.Optional["Locator"] = None,has_not: typing.Optional["Locator"] = None) -> "Locator":"""Page.locatorThe method returns an element locator that can be used to perform actions on this page / frame. Locator is resolvedto the element immediately before performing an action, so a series of actions on the same locator can in fact beperformed on different DOM elements. That would happen if the DOM structure between those actions has changed.[Learn more about locators](https://playwright.dev/python/docs/locators).Parameters----------selector : strA selector to use when resolving DOM element.has_text : Union[Pattern[str], str, None]Matches elements containing specified text somewhere inside, possibly in a child or a descendant element. Whenpassed a [string], matching is case-insensitive and searches for a substring. For example, `"Playwright"` matches`<article><div>Playwright</div></article>`.has_not_text : Union[Pattern[str], str, None]Matches elements that do not contain specified text somewhere inside, possibly in a child or a descendant element.When passed a [string], matching is case-insensitive and searches for a substring.has : Union[Locator, None]Narrows down the results of the method to those which contain elements matching this relative locator. For example,`article` that has `text=Playwright` matches `<article><div>Playwright</div></article>`.Inner locator **must be relative** to the outer locator and is queried starting with the outer locator match, notthe document root. For example, you can find `content` that has `div` in`<article><content><div>Playwright</div></content></article>`. However, looking for `content` that has `articlediv` will fail, because the inner locator must be relative and should not use any elements outside the `content`.Note that outer and inner locators must belong to the same frame. Inner locator must not contain `FrameLocator`s.has_not : Union[Locator, None]Matches elements that do not contain an element that matches an inner locator. Inner locator is queried against theouter one. For example, `article` that does not have `div` matches `<article><span>Playwright</span></article>`.Note that outer and inner locators must belong to the same frame. Inner locator must not contain `FrameLocator`s.Returns-------Locator"""return mapping.from_impl(self._impl_obj.locator(selector=selector,hasText=has_text,hasNotText=has_not_text,has=has._impl_obj if has else None,hasNot=has_not._impl_obj if has_not else None,))

### 用法

可以使用 `locator` 对象(`page.locator()返回值)的以下方法来查找元素:

Locator是Playwright中自动等待和重试的核心部分。简而言之,Locator代表在任何时刻在页面上查找元素的方法。
可以使用page.locator()方法创建一个Locator对象实例。
**方法:**
- **all**: 查找所有匹配的元素。
* `first()`: 返回第一个匹配的元素。等价于 `nth(0)`。
* `last()`: 返回最后一个匹配的元素。

- **all_inner_texts**: 获取所有匹配元素的内部文本。
- **all_text_contents**: 获取所有匹配元素的文本内容。
- **and_**: 逻辑与操作符,可以与其他Locator组合使用。
- **blur**: 触发元素失焦事件。
- **bounding_box**: 获取元素的边界框。
- **check**: 选中复选框或单选框。
- **clear**: 清空输入框中的文本。
- **click**: 单击元素。
- **count**: 计算匹配的元素数量。
- **dblclick**: 双击元素。
- **dispatch_event**: 分发指定事件到元素。
- **drag_to**: 将元素拖动到指定位置。
- **evaluate**: 在元素上下文中执行JavaScript代码。
- **evaluate_all**: 在所有匹配元素的上下文中执行JavaScript代码。
- **evaluate_handle**: 获取元素的JavaScript句柄。

- **fill**: 在输入框中输入文本。
- **filter**: 根据指定条件过滤匹配的元素。
- **focus**: 将焦点设置到元素。
- **frame_locator**: 在特定的iframe中查找元素。
- **get_attribute**: 获取元素的属性值。
- **get_by_alt_text**: 根据alt属性的值查找元素。
- **get_by_label**: 根据标签查找元素。
- **get_by_placeholder**: 根据placeholder属性的值查找元素。
- **get_by_role**: 根据角色查找元素。
- **get_by_test_id**: 根据测试ID查找元素。
- **get_by_text**: 根据文本内容查找元素。
- **get_by_title**: 根据标题查找元素。
- **highlight**: 在页面上突出显示匹配的元素。
- **hover**: 将鼠标悬停在元素上。
- **inner_html**: 获取元素的内部HTML。
- **inner_text**: 获取元素的内部文本。
- **input_value**: 获取输入框中的值。
- **is_checked**: 检查元素是否被选中。
- **is_disabled**: 检查元素是否被禁用。
- **is_editable**: 检查元素是否可编辑。
- **is_enabled**: 检查元素是否可用。
- **is_hidden**: 检查元素是否隐藏。
- **is_visible**: 检查元素是否可见。
- **locator**: 创建新的Locator实例。
- **nth**: 获取匹配元素中的第N个。
- **or_**: 逻辑或操作符,可以与其他Locator组合使用。
- **press**: 模拟按键操作。
- **press_sequentially**: 依次按下多个按键。
- **screenshot**: 对元素进行截图。
- **scroll_into_view_if_needed**: 将元素滚动到视图中。
- **select_option**: 选择下拉列表中的选项。
- **select_text**: 选择文本内容。
- **set_checked**: 设置复选框或单选框的选中状态。
- **set_input_files**: 设置输入文件的值。
- **tap**: 轻触元素。
- **text_content**: 获取元素的文本内容。
- **uncheck**: 取消选中复选框或单选框。
- **wait_for**: 等待匹配的元素出现。

### 示例

下面是一个使用 `page.locator()` 方法查找元素的示例:


-----------------------------------------------------------

 # 要输出所有匹配元素的HTML内容,包括元素本身,循环遍历元素列表,并分别获取每个元素的HTML内容。
# 以下是示例代码:
# elements = await page.locator('input').all()
# for element in elements:
#     html_content = await element.evaluate('(element) => element.outerHTML')
#     print(html_content)
# 这将打印所有匹配的输入框元素的HTML内容,包括元素本身。
# JavaScript箭头函数表达式的语法比普通函数表达式更简洁。

------------------
evaluate: 在元素上下文中执行JavaScript代码。
evaluate_all: 在所有匹配元素的上下文中执行JavaScript代码。
evaluate_handle: 获取元素的JavaScript句柄。

import asyncio
from playwright.async_api import async_playwrightasync def main():async with async_playwright() as playwright:browser = await playwright.chromium.launch(headless=False)page = await browser.new_page()await page.set_content('''<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"></div>''')# 创建一个Locator对象来查找按钮元素button_locator = page.locator('#my_button')# 使用evaluate方法在按钮元素上下文中执行JavaScript代码button_text = await button_locator.evaluate('(element) => element.textContent')print('Button Text:', button_text)# 使用evaluate_all方法在按钮元素上下文中执行JavaScript代码all_elements = await button_locator.evaluate_all('() => Array.from(document.querySelectorAll("p")).map(p => p.outerHTML)')print('All Elements:', all_elements)# 使用evaluate_handle方法获取按钮元素的JavaScript句柄button_handle = await button_locator.evaluate_handle('(element) => element.outerHTML')print('Button Handle:', button_handle)await browser.close()asyncio.run(main())

 这段代码中,我们使用了 map 函数和 Array.from 来获取所有段落元素的 outerHTML 属性。同时,直接获取按钮元素的 outerHTML 属性,以便输出按钮的 HTML 元素。

# 导入 Playwright
from playwright.async_api import async_playwright
import asyncio
from playwright.async_api import ElementHandle# 异步函数来运行 Playwright
async def main():# 创建 Playwright 实例async with async_playwright() as playwright:# 启动 Chromium 浏览器browser = await playwright.chromium.launch(headless=False)# 创建新页面page = await browser.new_page()# 设置页面内容await page.set_content('''<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"></div>''')print('****************模拟用户操作*********************')# 等待3秒await page.wait_for_timeout(3000)# 在输入框中输入文本await page.type('#my_input', 'Hello, Playwright!')# 在按钮上执行点击操作await page.press('#my_button', 'Enter')# 在复选框上执行勾选操作await page.check('#my_checkbox')# 等待一会儿,以便观察结果await asyncio.sleep(3)       print('*********page.text,/page.inner,********************')# 获取元素的文本内容text = await page.text_content('#my_div')print("元素的文本内容:", text)# 获取元素的内部文本内容inner_text = await page.inner_text('#my_div')print("元素的内部文本内容:\n", inner_text)# 获取元素的内部 HTML 内容inner_html = await page.inner_html('#my_div')print("元素的内部 HTML 内容:", inner_html)# 获取元素的指定属性值attribute_value = await page.get_attribute('#my_div', 'class')print("元素的 class 属性值:", attribute_value)print('***************page.locator********************')# 创建一个 Locator 对象# locatorx = page.locator('//div[@id="my_div"]')locatorx = page.locator('div[id="my_div"]')#locatorx = page.locator('.container')# locatorx = page.locator('//div')# locatorx = page.locator('div.container')print(locatorx)# 使用列表推导式获取所有匹配元素的内部 HTML 内容# all_inner_html = [await  element.inner_html() for element in await locatorx.all()]# 获取所有匹配元素的内部 HTML 内容all_html = []for element in await locatorx.all():html_content = await element.inner_html()all_html.append(html_content)# 打印所有匹配元素的内部 HTML 内容for html_content in all_html:print(html_content)# # 调用 all() 方法获取所有匹配的元素# all_elements = await locator.all()# # 遍历所有元素并获取它们的内部 HTML 内容# for element_locator in all_elements:#         inner_html_content = await element_locator.inner_html()#         print(inner_html_content)print('****************page.query_selector_all*********************')# 查询所有匹配选择器的元素# async def query_selector_all(self, selector: str) -> List[ElementHandle]:#        return await self._main_frame.query_selector_all(selector)elements = await page.query_selector_all('.container > p')# 检查对象是否是 ElementHandle 类型的实例if isinstance(elements[0], ElementHandle):print("This is an ElementHandle object")print(elements)# [<JSHandle preview=JSHandle@node>, <JSHandle preview=JSHandle@node>, <JSHandle preview=JSHandle@node>]for element in elements:# 获取元素的文本内容text_content = await element.inner_text()print(text_content)  # 去除文本内容两端的空白字符print('***************page.evaluate************************')# 使用 evaluate执行 JavaScript 代码来获取页面上的 HTML 内容html_content = await page.evaluate('document.querySelector(".container").innerHTML')#     '''() => {#     const container = document.querySelector('.container');#     return container.innerHTML;# }''')# 打印 HTML 内容print(html_content)print('****************page.evaluate_handle************************')# 使用 evaluate_handle 方法执行 JavaScript 代码,获取指定选择器的元素句柄JSHandleelement_handle = await page.evaluate_handle('document.querySelector(".container")')# 获取元素的属性# element_class = await element_handle.get_property('className')# print(await element_class.json_value())  # 打印元素的 class 属性值  text_content = await element_handle.evaluate('(element) => element.textContent')print(text_content)# 关闭浏览器await browser.close()# 运行主函数
asyncio.run(main())# 在 Playwright 中,有两种重要的对象类型:ElementHandle 和 JSHandle。
# ElementHandle:
# ElementHandle 代表着一个页面中的 DOM 元素。它是一个指向页面中实际元素的引用,可以让您执行诸如点击、输入等操作,并且可以获取元素的属性、文本内容等信息。
# JSHandle:
# JSHandle 代表着一个 JavaScript 对象,它可能是一个 DOM 元素,也可能是其他 JavaScript 对象。JSHandle 提供了一组方法来执行 JavaScript 代码、获取属性值、执行方法等操作。
# 通常情况下,当您使用 evaluate_handle 方法来执行 JavaScript 代码时,返回的对象可能是一个 ElementHandle 或者是一个 JSHandle,具体取决于执行的 JavaScript 代码以及其返回值类型。
# 如果执行的 JavaScript 代码返回的是一个 DOM 元素,那么返回的就是一个 ElementHandle;
# 如果返回的是其他 JavaScript 对象,那么返回的就是一个 JSHandle。# 您可以根据返回的对象类型来决定如何进一步操作它。如果返回的是一个 ElementHandle,您可以执行与页面元素相关的操作;
# 如果返回的是一个 JSHandle,您可以执行 JavaScript 对象的操作。
# 通常,您可以使用 instanceof 操作符来检查对象的类型,以便根据需要执行相应的操作。# DOM(Document Object Model)元素是HTML或XML文档中的一个节点。它可以是文档的根节点、元素节点、文本节点、注释节点等。
# DOM元素在HTML页面中表示页面中的标签,如<div>、<p>、<span>等。
# DOM元素具有以下特点:
# 标签:DOM元素对应于HTML页面中的标签,如<div>、<p>等。
# 属性:DOM元素可以具有属性,这些属性可以包含元素的额外信息或设置,如id、class、style等。
# 子节点:DOM元素可以包含其他元素作为子节点,形成了节点之间的层次结构,如<div>元素可以包含<p>、<span>等作为其子节点。
# 方法和事件:DOM元素有一些方法和事件,可以操作和监听元素的行为和状态。
# 通过使用DOM,可以通过JavaScript或其他脚本语言来访问和操作HTML文档中的元素,比如改变样式、添加新元素、删除元素等。
# DOM提供了一种方便的方式来操作页面结构和内容,并与用户交互。# Playwright 的页面类(Page)提供的一些用于获取元素信息的异步方法
# async def text_content(
# self, selector: str, strict: bool = None, timeout: float = None
# ) -> Optional[str]:
# return await self._main_frame.text_content(**locals_to_params(locals()))# async def inner_text(
# self, selector: str, strict: bool = None, timeout: float = None
# ) -> str:
# return await self._main_frame.inner_text(**locals_to_params(locals()))# async def inner_html(
# self, selector: str, strict: bool = None, timeout: float = None
# ) -> str:
# return await self._main_frame.inner_html(**locals_to_params(locals()))# async def get_attribute(
# self, selector: str, name: str, strict: bool = None, timeout: float = None
# ) -> Optional[str]:
# return await self._main_frame.get_attribute(**locals_to_params(locals()))# 用于在指定的元素上输入文本
# await page.type('#my_input', 'Hello, Playwright!')
# async def type(
#     self,
#     selector: str, #要在其上输入文本的元素的选择器
#     text: str,  #要输入的文本内容
#     delay: float = None,
#     timeout: float = None,
#     noWaitAfter: bool = None,
#     strict: bool = None,
# ) -> None:
#     return await self._main_frame.type(**locals_to_params(locals()))#     def locator(
#         self,
#         selector: str,
#         *,
#         has_text: typing.Optional[typing.Union[str, typing.Pattern[str]]] = None,
#         has_not_text: typing.Optional[typing.Union[str, typing.Pattern[str]]] = None,
#         has: typing.Optional["Locator"] = None,
#         has_not: typing.Optional["Locator"] = None
#     ) -> "Locator":
#         """Page.locator
# page.locator() 是 Playwright 中用于定位元素的方法,它可以通过指定的选择器来选择页面上的元素。
# 在你提供的函数签名中,这个方法还支持一些额外的参数来进一步筛选元素。
# 在你的函数签名中,有以下关键参数:
# selector: str:用于指定要选择的元素的选择器。
# has_text: Optional[Union[str, Pattern[str]]]:可选参数,用于指定元素必须包含特定文本。
# has_not_text: Optional[Union[str, Pattern[str]]]:可选参数,用于指定元素不能包含特定文本。
# has: Optional[Locator]:可选参数,用于指定元素必须符合额外条件。
# has_not: Optional[Locator]:可选参数,用于指定元素不能符合额外条件。
# 使用这些参数,你可以更精确地选择页面上的元素,以满足特定的需求。
# 例如,你可以使用 has_text 参数来找到包含特定文本的元素,或者使用 has 参数来进一步筛选元素。# async def query_selector_all(self, selector: str) -> typing.List["ElementHandle"]:
#     """Page.query_selector_all
#     The method finds all elements matching the specified selector within the page. If no elements match the selector,
#     the return value resolves to `[]`.

 type、press 和 check 方法来模拟用户与页面元素的交互操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一次实战项目所学(通用接口篇)

记一次实战项目所学&#xff08;通用接口篇&#xff09; 1.加解密工具&#xff08;AES&#xff0c;RSA&#xff0c;MD5&#xff09; 账号登录时可用 a.引依赖 <dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactI…

一、什么是 HarmonyOS ?

HarmonyOS 是华为开发的一款面向未来的全场景分布式智慧操作系统&#xff0c;将逐步覆盖 18N 全场景终端设备。 对消费者而言&#xff0c;HarmonyOS 用一个“统一的软件系统”&#xff0c;从根本上解决消费者面对大量智能终端体验割裂的问题&#xff0c;为消费者带来统一、便利…

Kafka Stream入门

1. 什么是流式计算 流式计算&#xff08;Stream Processing&#xff09;是一种计算模型&#xff0c;旨在处理连续的数据流。与传统的批处理模型不同&#xff0c;流式计算可以实时或接近实时地处理和分析数据&#xff0c;这意味着数据在生成后不久就被处理&#xff0c;而不是存…

基于android的物业管理系统的设计与实现19.8

目录 基于android的物业管理系统的设计与实现 3 摘 要 3 Android property managemengt system 5 Abstract 5 1 绪论 6 1.1 选题背景 6 1.2 课题研究现状 6 1.3 设计研究主要内容 7 1.4 系统主要设计思想 8 2 开发环境 8 2.1 Android系统的结构 8 图2-1 Android系统架构图 9 2…

Python绘图-14绘制3D图(下)

14.7绘制3D等高线图个性化colormap 14.7.1图像呈现 14.7.2绘图代码 import numpy as np # 导入numpy库&#xff0c;numpy是Python的一个强大的数值计算扩展程序库&#xff0c;支持大量的维度数组与矩阵运算。 import matplotlib.pyplot as plt # 导入matplotlib的绘图模块p…

UDP编程及特点

目录 1.UDP编程流程 2.recvfrom()、sento() 3.代码演示 3.udp特点 1.UDP编程流程 socket()用来创建套接字&#xff0c;使用 udp 协议时&#xff0c;选择数据报服务 SOCK_DGRAM。sendto()用来发送数据&#xff0c;由于 UDP 是无连接的&#xff0c;每次发送数据都需要指定对端…

神经网络基本使用

1. 卷积层 convolution layers import torch import torchvision from torch import nn from torch.nn import Conv2d from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterdataset torchvision.datasets.CIFAR10(./dataset,trainFa…

Aspose.Words指定位置插入table

如果在创建书签&#xff0c;然后在书签位置插入表格&#xff0c;会出现格式错乱&#xff0c;在单元格位置里面有一个表格&#xff0c;不符合实际使用。正确做法是复制模板文件里面的表格行&#xff0c;然后插入若干行。 如图标记红色位置插入动态数据行&#xff0c;是先复制标…

day1_C++:实现C++风格字符串输出

1.提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数&#xff0c;要求使用C风格字符串完成 程序代码&#xff1a; #include <iostream>//标准输入输出流 #include <string.h>//C中字符串相关头文件 using na…

HBase分布式数据库的原理和架构

一、HBase简介 HBase是是一个高性能、高可靠性、面向列的分布式数据库&#xff0c;它是为了在廉价的硬件集群上存储大规模数据而设计的。HBase利用Hadoop HDFS作为其文件存储系统&#xff0c;且Hbase是基于Zookeeper的。 二、HBase架构 *图片引用 Hbase采用Master/Slave架构…

1、设计模式之认识设计模式

设计模式是一种经过验证的、被广泛应用的解决特定问题的软件设计方案&#xff0c;它提供了一种在软件设计中反复使用的解决方案。设计模式通常描述了一个问题的情境、解决方案和解决方案的优点和缺点。设计模式不是一种具体的编程语言特性或库&#xff0c;而是一种通用的设计思…

HDFS(Hadoop分布式文件系统)具有高吞吐量特点的原因

数据分块和分布式存储&#xff1a;HDFS将大文件分割成多个数据块&#xff0c;并通过数据块的复制和分布式存储在集群中的多台机器上存储这些数据块。这样&#xff0c;可以利用多台机器的并行处理能力&#xff0c;并同时读取或写入多个数据块&#xff0c;从而提高整体的吞吐量。…

LeetCode226题:翻转二叉树(python3)

class Solution:def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:if not root:return rootleft self.invertTree(root.left)right self.invertTree(root.right)root.left,root.right right,leftreturn root复杂度分析 时间复杂度&#xff1a;O(N…

HTML 学习笔记(十一)表单

一、分块 1.单行文本框控件–文本框和密码框 文本框控件通过单标签input实现&#xff0c;其具有必要属性type来控制输入控件的类型(默认为text即文本信息)&#xff0c;密码框的type为password(口令)。   表单的动作属性定义了目的文件的文件名。由动作属性定义的这个文件通常…

Docker 安装部署MySQL教程

前言 Docker安装MySQL镜像以及启动容器&#xff0c;大致都是三步&#xff1a;查询镜像–>拉取镜像–>启动容器 1、查询镜像 docker search mysql2、拉取镜像 拉取镜像时选择stars值较高的 docker pull mysql:5.7 #这里指定拉取对应的版本Mysql5.7&#xff0c;没有指…

安卓kotlin面试题 71-80

71. Kotlin中的@Metadata注解介绍以及生成流程 ?kotlin中的@Metadata注解是一个很特殊的注解,它记录了Kotlin代码中的一些信息,比如 class 的可见性,function 的返回值,参数类型,property 的 lateinit,nullable 的属性,typealias类型别名声明等。 我们都知道Kotlin代码…

ArcGIS学习(十六)基于交通网络的城市情景分析

ArcGIS学习(十六)基于交通网络的城市情景分析 本任务给大家带来一个非常重要的内容一一基于交通网络的城市情景分析。基于交通网络模拟交通出行并进行相关分析是ArcGIS里面一种常用的分析方法,大家一定要掌握!本任务包括三个关卡: 交通网络模型构建基于交通网络模型的基本…

Gitlab CICD 下载artifacts文件并用allure打开,或bat文件打开

allure命令行打开aritfacts报告 首先下载allure.zip&#xff0c;并解压 配置环境变量 使用命令行打开allure文件夹 allure open 2024-03-11-14-54-40 2024-03-11-14-54-40 包含index.html Bat文件打开artifacts There are 2 html reports in the download artifacts.zip S…

EXCEL根据某列的数字N,增加N-1行相同的数据

因为工作需要&#xff0c;需要将表格数据拆分&#xff0c;类似于相同的订单有6笔&#xff0c;数据表中就是一行数据但是订单数为6&#xff0c;但是需要将其拆分成相同6笔的订单数为1的数据行。 需要使用VBA代码&#xff0c;具体做法如下&#xff1a; Dim i As Long, j As Long…

【Office】Word、Excel和PowerPoint中常用的一些快捷键

以下是Word、Excel和PowerPoint中常用的一些快捷键&#xff1a; Word中的快捷键&#xff1a; Ctrl S&#xff1a;保存文件Ctrl C&#xff1a;复制选定的内容Ctrl X&#xff1a;剪切选定的内容Ctrl V&#xff1a;粘贴剪切或复制的内容Ctrl Z&#xff1a;撤销上一步操作Ct…