《最新出炉》系列小成篇-Python+Playwright自动化测试-66 - 等待元素至指定状态(出现、移除、显示和隐藏)

news2024/11/15 17:43:22

1.简介

在我们日常工作中进行UI自动化测试时,保证测试的稳定性至关重要。其中一个关键方面是正确地定位和操作网页中的元素。在网页中,元素可能处于不同的状态,有些可能在页面加载完成之前不在DOM中,需要某些操作后才会出现,而其他元素可能一直存在于DOM中,但最初处于隐藏状态,需要通过操作才能使其出现进而处于可见状态。 因此如果在执行脚本时没有考虑到元素的状态,很可能导致脚本执行失败。为了保证自动化测试的稳定性,我们需要确保在执行操作之前,所需的元素已经达到了指定状态。

下面宏哥将介绍和分析讲解三种常用的元素等待方式:wait_for_timeout(),wait_for(),wait_for_selector() 和 wait_for_element_state()以及四者之间的优劣势。

2.强制等待

2.1wait_for_timeout()

wait_for_timeout() 方法会等待调用方法时指定的时间。‌

这个方法用于设置一个等待的超时时间,‌它允许程序在执行某些操作前等待指定的时间。‌如果在设定的时间内操作未完成,‌则可能会抛出超时错误。‌这种机制在编程中非常有用,‌尤其是在需要等待某个条件满足或资源可用时。‌例如,‌在使用playwright进行网页自动化测试时,‌wait_for_timeout()方法可以用来确保在继续执行操作之前,‌网页元素已经加载完成或处于可操作状态。‌如果元素未在给定的时间内加载完成,‌则可以通过捕获超时错误来处理这种情况,‌从而避免操作失败。官方定义的函数如下:

    def wait_for_timeout(self, timeout: float) -> None:
        """Page.wait_for_timeout

        Waits for the given `timeout` in milliseconds.

        Note that `page.waitForTimeout()` should only be used for debugging. Tests using the timer in production are going
        to be flaky. Use signals such as network events, selectors becoming visible and others instead.

        **Usage**

        ```py
        # wait for 1 second
        await page.wait_for_timeout(1000)
        ```

        ```py
        # wait for 1 second
        page.wait_for_timeout(1000)
        ```

        Parameters
        ----------
        timeout : float
            A timeout to wait for
        """

        return mapping.from_maybe_impl(
            self._sync(self._impl_obj.wait_for_timeout(timeout=timeout))
        )

3.自动等待

3.1.wait_for()

wait_for() 是先定位元素,再等待元素满足指定状态。先定位元素,再使用wait_for() 方法也可以等待元素到达指定的状态。

如果元素已满足条件,则立即返回。否则,它会等待直到超时时间到达为止。

该方法接受两个关键字参数:
timeout:指定最大等待时间(以毫秒为单位)。默认为 30000(30秒),但可以更改。
state:指定要等待的状态。默认为 ‘visible’。可以是 ‘attached’、‘detached’、‘hidden’ 或 ‘visible’ 中的一个。

官方定义的函数如下:

    def wait_for(
        self,
        *,
        timeout: typing.Optional[float] = None,
        state: typing.Optional[
            Literal["attached", "detached", "hidden", "visible"]
        ] = None
    ) -> None:
        """Locator.wait_for

        Returns when element specified by locator satisfies the `state` option.

        If target element already satisfies the condition, the method returns immediately. Otherwise, waits for up to
        `timeout` milliseconds until the condition is met.

        **Usage**

        ```py
        order_sent = page.locator(\"#order-sent\")
        await order_sent.wait_for()
        ```

        ```py
        order_sent = page.locator(\"#order-sent\")
        order_sent.wait_for()
        ```

        Parameters
        ----------
        timeout : Union[float, None]
            Maximum time in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable timeout. The default value can
            be changed by using the `browser_context.set_default_timeout()` or `page.set_default_timeout()` methods.
        state : Union["attached", "detached", "hidden", "visible", None]
            Defaults to `'visible'`. Can be either:
            - `'attached'` - wait for element to be present in DOM.
            - `'detached'` - wait for element to not be present in DOM.
            - `'visible'` - wait for element to have non-empty bounding box and no `visibility:hidden`. Note that element
              without any content or with `display:none` has an empty bounding box and is not considered visible.
            - `'hidden'` - wait for element to be either detached from DOM, or have an empty bounding box or
              `visibility:hidden`. This is opposite to the `'visible'` option.
        """

        return mapping.from_maybe_impl(
            self._sync(self._impl_obj.wait_for(timeout=timeout, state=state))
        )

宏哥还是按之前toast的消息那个demo来演示,这里就不写demo的HTML代码,不知道的可以看宏哥之前的文章:传送门

3.1.1代码设计

3.1.2参考代码
# coding=utf-8🔥

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2024-07-16
@author: 北京-宏哥
北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project: 《最新出炉》系列小成篇-Python+Playwright自动化测试-66 - 等待元素至指定状态
'''

# 3.导入模块
from playwright.sync_api import Playwright, sync_playwright, expect

def run(playwright: Playwright) -> None:

    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto("E:/Desktop/test/toast.html")
    # 点击 点击关注 按钮
    page.locator("#hongge").click()
    # 等待元素出现在dom
    page.locator('//html/body/div').wait_for(state="attached")
    # 获取元素文本
    print(page.locator('//html/body/div').inner_text())
    page.locator('//html/body/div').wait_for(state="detached")
    print("元素已经从DOM移除")
    page.wait_for_timeout(1000)
    context.close()
    browser.close()

with sync_playwright() as playwright:
    run(playwright)
3.1.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作。如下图所示:

3.2wait_for_selector()

page.wait_for_selector() 是 Playwright 中的一个方法,‌用于等待与指定 CSS 选择器匹配的元素出现在页面中。‌

这个方法接受一个选择器参数和一个可选的选项参数。‌常用的选项参数包括:‌

  • visible:‌指定元素必须可见,‌默认为 False。‌
  • hidden:‌指定元素必须隐藏,‌默认为 False。‌
  • state:‌可以设置为 visible、‌hidden、‌attached 或 detached,‌用于等待元素达到特定的状态。‌
  • timeout:‌设置等待的超时时间,‌以毫秒为单位。‌如果在指定的时间内元素未达到等待的状态,‌则会抛出超时异常。‌

官方定义的函数如下:

    def wait_for_selector(
        self,
        selector: str,
        *,
        state: typing.Optional[
            Literal["attached", "detached", "hidden", "visible"]
        ] = None,
        timeout: typing.Optional[float] = None,
        strict: typing.Optional[bool] = None
    ) -> typing.Optional["ElementHandle"]:
        """ElementHandle.wait_for_selector

        Returns element specified by selector when it satisfies `state` option. Returns `null` if waiting for `hidden` or
        `detached`.

        Wait for the `selector` relative to the element handle to satisfy `state` option (either appear/disappear from dom,
        or become visible/hidden). If at the moment of calling the method `selector` already satisfies the condition, the
        method will return immediately. If the selector doesn't satisfy the condition for the `timeout` milliseconds, the
        function will throw.

        **Usage**

        ```py
        await page.set_content(\"<div><span></span></div>\")
        div = await page.query_selector(\"div\")
        # waiting for the \"span\" selector relative to the div.
        span = await div.wait_for_selector(\"span\", state=\"attached\")
        ```

        ```py
        page.set_content(\"<div><span></span></div>\")
        div = page.query_selector(\"div\")
        # waiting for the \"span\" selector relative to the div.
        span = div.wait_for_selector(\"span\", state=\"attached\")
        ```

        **NOTE** This method does not work across navigations, use `page.wait_for_selector()` instead.

        Parameters
        ----------
        selector : str
            A selector to query for.
        state : Union["attached", "detached", "hidden", "visible", None]
            Defaults to `'visible'`. Can be either:
            - `'attached'` - wait for element to be present in DOM.
            - `'detached'` - wait for element to not be present in DOM.
            - `'visible'` - wait for element to have non-empty bounding box and no `visibility:hidden`. Note that element
              without any content or with `display:none` has an empty bounding box and is not considered visible.
            - `'hidden'` - wait for element to be either detached from DOM, or have an empty bounding box or
              `visibility:hidden`. This is opposite to the `'visible'` option.
        timeout : Union[float, None]
            Maximum time in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable timeout. The default value can
            be changed by using the `browser_context.set_default_timeout()` or `page.set_default_timeout()` methods.
        strict : Union[bool, None]
            When true, the call requires selector to resolve to a single element. If given selector resolves to more than one
            element, the call throws an exception.

        Returns
        -------
        Union[ElementHandle, None]
        """

        return mapping.from_impl_nullable(
            self._sync(
                self._impl_obj.wait_for_selector(
                    selector=selector, state=state, timeout=timeout, strict=strict
                )
            )
        )

1.等待元素出现在DOM中

page.wait_for_selector("定位方法", state='attached')

2.等待从DOM中移除

page.wait_for_selector("定位方法", state='detached')

3.等待元素可见

page.wait_for_selector("定位方法", state="visible")

4.等待元素不可见(隐藏)

page.wait_for_selector("定位方法", state='hidden')

如果没有传 state 参数,默认情况下是等待元素可见 visible

page.wait_for_selector("定位方法")
3.2.1等待元素出现和移除

默认情况下,在HTML页面的DOM节点里面是没有这个元素的,通过某些操作(点击【点击关注】按钮),这个元素才出现,如下图所示:

宏哥还是按之前toast的消息那个demo来演示,这里就不写demo的HTML代码,不知道的可以看宏哥之前的文章:传送门

3.2.1.1代码设计

3.2.1.2参考代码
# coding=utf-8🔥

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2024-07-16
@author: 北京-宏哥
北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project: 《最新出炉》系列小成篇-Python+Playwright自动化测试-66 - 等待元素至指定状态
'''

# 3.导入模块
from playwright.sync_api import Playwright, sync_playwright, expect

def run(playwright: Playwright) -> None:

    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto("E:/Desktop/test/toast.html")
    # 点击 点击关注 按钮
    page.locator("#hongge").click()
    # 等待元素出现在dom
    loc_msg = page.wait_for_selector('//html/body/div', state="attached")
    # 获取元素文本
    print(loc_msg.inner_text())
    page.wait_for_selector('//html/body/div', state="detached")
    print("元素已经从DOM移除")
    page.wait_for_timeout(1000)
    context.close()
    browser.close()

with sync_playwright() as playwright:
    run(playwright)
3.2.1.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作。如下图所示:

3.2.2等待元素显示和隐藏

默认情况下,在HTML页面的元素本身就在DOM里,只是通过某些操作,状态发生改变:隐藏和显示。如下提示语本来就在DOM里,只是默认是隐藏状态。宏哥还在之前的演示demo找到了一个这样的场景,刚好用来演示。

3.2.2.1代码设计

3.2.2.2参考代码
# coding=utf-8🔥

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2024-07-16
@author: 北京-宏哥
北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project: 《最新出炉》系列小成篇-Python+Playwright自动化测试-66 - 等待元素至指定状态
'''

# 3.导入模块
from playwright.sync_api import Playwright, sync_playwright, expect

def run(playwright: Playwright) -> None:

    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto("https://sahitest.com/demo/visible.htm")
    #点击隐藏按钮
    page.locator("//html/body/form/input[4]").click()
    page.wait_for_selector("#uv", state="hidden")
    print("元素已经隐藏")
    page.wait_for_timeout(1000)
    # 点击显示按钮
    page.locator("//html/body/form/input[5]").click()
    loc_msg = page.wait_for_selector("#uv", state="visible")
    print("元素已经显示")
    # 获取元素文本
    print(loc_msg.inner_text())
    page.wait_for_timeout(1000)
    context.close()
    browser.close()

with sync_playwright() as playwright:
    run(playwright)
3.2.2.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作(注意:using visibility显示和隐藏,可以加长等待时间,看的更清楚)。如下图所示:

3.3 wait_for_element_state()

wait_for_load_state(),等待事件被触发。等待前面按钮触发的事件加载完成,才进行下面的操作。

在Python的Playwright库中,‌wait_for_load_state()方法用于等待页面达到特定的加载状态。‌该方法接受三个参数:‌

  • state:‌页面应该达到的加载状态,‌可以是load、‌domcontentloadednetworkidle。‌这些状态分别代表页面的不同加载程度,‌其中load表示页面完全加载,‌domcontentloaded表示文档内容已经加载,‌而networkidle则表示网络几乎无连接,‌即页面加载已完成。‌

  • timeout:‌等待的最长时间,‌单位为毫秒。‌默认值为30 * 1000,‌即30秒。‌这个参数用于设置等待操作的最大超时时间,‌以避免程序长时间等待而无法继续执行。‌

  • wait_until:‌等待的事件类型,‌可以是load、‌domcontentloaded、‌networkidle0networkidle2中的一个。‌这个参数用于指定等待的具体事件类型,‌以便更精确地控制等待的条件。‌

通过使用wait_for_load_state()方法,‌可以确保在继续执行后续操作之前,‌页面已经完全加载完成,‌从而避免因页面元素未完全加载而导致的操作失败或错误。

官方定义的函数如下:

    def wait_for_load_state(
        self,
        state: typing.Optional[
            Literal["domcontentloaded", "load", "networkidle"]
        ] = None,
        *,
        timeout: typing.Optional[float] = None
    ) -> None:
        """Page.wait_for_load_state

        Returns when the required load state has been reached.

        This resolves when the page reaches a required load state, `load` by default. The navigation must have been
        committed when this method is called. If current document has already reached the required state, resolves
        immediately.

        **Usage**

        ```py
        await page.get_by_role(\"button\").click() # click triggers navigation.
        await page.wait_for_load_state() # the promise resolves after \"load\" event.
        ```

        ```py
        page.get_by_role(\"button\").click() # click triggers navigation.
        page.wait_for_load_state() # the promise resolves after \"load\" event.
        ```

        ```py
        async with page.expect_popup() as page_info:
            await page.get_by_role(\"button\").click() # click triggers a popup.
        popup = await page_info.value
        # Wait for the \"DOMContentLoaded\" event.
        await popup.wait_for_load_state(\"domcontentloaded\")
        print(await popup.title()) # popup is ready to use.
        ```

        ```py
        with page.expect_popup() as page_info:
            page.get_by_role(\"button\").click() # click triggers a popup.
        popup = page_info.value
        # Wait for the \"DOMContentLoaded\" event.
        popup.wait_for_load_state(\"domcontentloaded\")
        print(popup.title()) # popup is ready to use.
        ```

        Parameters
        ----------
        state : Union["domcontentloaded", "load", "networkidle", None]
            Optional load state to wait for, defaults to `load`. If the state has been already reached while loading current
            document, the method resolves immediately. Can be one of:
            - `'load'` - wait for the `load` event to be fired.
            - `'domcontentloaded'` - wait for the `DOMContentLoaded` event to be fired.
            - `'networkidle'` - **DISCOURAGED** wait until there are no network connections for at least `500` ms. Don't use
              this method for testing, rely on web assertions to assess readiness instead.
        timeout : Union[float, None]
            Maximum operation time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can
            be changed by using the `browser_context.set_default_navigation_timeout()`,
            `browser_context.set_default_timeout()`, `page.set_default_navigation_timeout()` or
            `page.set_default_timeout()` methods.
        """

        return mapping.from_maybe_impl(
            self._sync(self._impl_obj.wait_for_load_state(state=state, timeout=timeout))
        )

宏哥在这个网站:https://www.jq22.com/ 找了一个demo,只有加载完成才会出现文字,然后对其进行定位打印文本。

3.3.1代码设计

3.3.2参考代码
# coding=utf-8🔥

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2024-07-16
@author: 北京-宏哥
北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project: 《最新出炉》系列小成篇-Python+Playwright自动化测试-66 - 等待元素至指定状态
'''

# 3.导入模块
from playwright.sync_api import Playwright, sync_playwright, expect

def run(playwright: Playwright) -> None:

    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto("https://www.jq22.com/demo/jquery-jdt20160820/")
    page.wait_for_load_state()
    print(page.locator('//*[@id="progress_content"]/i[4]/span').inner_text())
    context.close()
    browser.close()

with sync_playwright() as playwright:
    run(playwright)
3.3.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作。如下图所示:

敲黑板!!!1.注意自动化测试的加载的时间不要超过此方法的默认时间,超时就会报错了哈!!!这个网站需要加载40S才会出现文字,如下图所示:

3.3.4代码设计

3.3.5参考代码
# coding=utf-8🔥

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2024-07-16
@author: 北京-宏哥
北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project: 《最新出炉》系列小成篇-Python+Playwright自动化测试-66 - 等待元素至指定状态
'''

# 3.导入模块
from playwright.sync_api import Playwright, sync_playwright, expect

def run(playwright: Playwright) -> None:

    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto("https://sahitest.com/demo/php/delayedLoadInner.php")

    page.wait_for_load_state()

    print(page.locator("//html/body/div").inner_text())
    print(page.locator("//html/body/span").inner_text())
    context.close()
    browser.close()

with sync_playwright() as playwright:
    run(playwright)
3.3.6运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出(.运行代码控制台报错,因为加载这个页面需要40s,而此方法默认30000ms=30s,超时报错),如下图所示:

2.运行代码后电脑端的浏览器的动作。如下图所示:

4.小结

4.1wait_for() 和 wait_for_selector()使用区别

wait_for() 方法 和 wait_for_selector()使用区别:

page.locator('定位元素').wait_for() 返回的是None,后面不能继续操作元素

page.wait_for_selector("定位方法") 返回的是locator 对象,后面可以继续操作元素

好了,今天时间也不早了,宏哥就讲解和分享到这里,感谢您耐心的阅读,希望对您有所帮助。

 每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问)或者微信搜索: 北京宏哥  公众号提前解锁更多干货。

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

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

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

相关文章

视频剪辑sdk,跨平台部署,助力企业差异化竞争

在这个内容为王的时代&#xff0c;视频已成为连接用户、传递价值的核心媒介。无论是社交媒体、在线教育、短视频平台还是新闻资讯&#xff0c;高质量的视频内容都是吸引用户、提升用户体验的关键。然而&#xff0c;对于众多企业而言&#xff0c;如何高效、专业地处理视频内容&a…

字节跳动春节抖音视频红包系统设计与实现--图文解析

字节跳动春节抖音视频红包系统设计与实现–图文解析 原作者&#xff1a;字节跳动技术团队 原文链接&#xff1a;https://www.toutiao.com/article/7114224228030841374 原标题&#xff1a;2022 春节抖音视频红包系统设计与实现 我们做了什么 业务背景 在春节活动期间&…

洛谷 P10034 「Cfz Round 3」Circle

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] [Solution] \color{blue}{\texttt{[Solution]}} [Solution] 这是道好题。 建图&#xff0c;对每一个 i → p i i \to p_{i} i→pi​ 都建立一个有向边&#xff0c;就可以得到一个…

记一次学习--[网鼎杯 2018]Comment二次注入

目录 本文章只展示二次注入过程&#xff0c;后续获取flag并不展示 靶场 网站流程、密码的破解和目录的查询以及对于源代码获取 密码暴力破解 网站目录扫描 网站源代码获取 网站流程 尝试注入 注入代码 本文章只展示二次注入过程&#xff0c;后续获取flag并不展示 靶场…

IntelliJ IDEA 2024.2 夏季大版本发布,不得不说,更强了!

因 CSDN 上传大小限制&#xff0c;本文推荐微信中阅读&#xff0c;动图更完整&#xff0c;微信中阅读&#xff0c;请欢迎关注公众号&#xff1a;CodeFit 创作不易&#xff0c;如果你觉得这篇文章对您有帮助&#xff0c;请不要忘了 点赞、分享 和 关注&#xff0c;为我的 持续创…

Katalon Studio 使用教程——自动获取元素定位功能

这个功能很实用&#xff0c;简单来讲可以形容为&#xff0c;想要哪里点哪里&#xff0c;so easy。 比如你想定位某个输入框&#xff0c;只需要按住【Alt】&#xff0c;点一下输入框&#xff0c;系统就自动记录下来这个输入框叫什么&#xff0c;它的xpath是什么。你想要按钮就点…

arXiv2024.8.6 | LLaVA-OneVision:Easy Visual Task Transfer

Comment: Project Homepage: https://llava-vl.github.io/blog/2024-08-05-llava-onevision/ 论文标题&#xff1a;LLaVA-OneVision&#xff1a;Easy Visual Task Transfer 论文地址&#xff1a;https://arxiv.org/abs/2408.03326 GitHub&#xff1a;https://llava-vl.githu…

4岁小孩孤独症的表现

在儿童的成长过程中&#xff0c;孤独症&#xff08;也称自闭症&#xff09;的早期识别与干预至关重要。对于4岁的孩子而言&#xff0c;孤独症的表现可能已经开始显现&#xff0c;家长和教育者需保持高度敏感&#xff0c;以便及时采取措施。 社交互动障碍&#xff1a;4岁孤独症儿…

Stable Diffusion绘画 | 图生图-上传重绘蒙版

上传重绘蒙版&#xff0c;可以弥补局部重绘的缺点&#xff0c;能够更精细的修改画面中的指定区域 使用PS制作的蒙版图片为耳朵下方区域&#xff0c;可以为图片中的女生带上不同款式的耳环。 参数配置&#xff1a; 调整提示词&#xff1a; 生成图片如下所示&#xff1a; 调整提…

龙腾CMS downloadFile接口任意文件读取漏洞复现 [附POC]

文章目录 龙腾CMS downloadFile接口任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现龙腾CMS downloadFile接口任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术从事非…

分享一个基于数据可视化的交通感知与车辆检测协同系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

【SQL】产品销售分析 I

目录 题目 分析 代码 题目 销售表 Sales&#xff1a; -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | ---------------…

【省流】入网,继续更!

大家好&#xff0c;我是一名默默学习的计算机小菜菜 在几分钟前我决定继续学习计算机知识和写博客 在这之前我已经停写了很久了&#xff0c;因为我真的找不到相关工作啊啊啊&#xff0c;有点萎靡&#xff0c;经常性精神内耗&#xff0c; 而之所以我死灰复燃&#xff08;可能不…

NeRF的代码复现以及人工智能入门

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Effective-Java-Chapter4

https://github.com/clxering/Effective-Java-3rd-edition-Chinese-English-bilingual/tree/dev/Chapter-4 准则一 减少类和成员的可访问性 如果一个方法覆盖了超类方法&#xff0c;那么它在子类中的访问级别就不能比超类 [JLS, 8.4.8.3] 更严格非零长度的数组总是可变的&am…

3、pnpm yarn npm

项目里实际上就只有这些依赖 node module 里却有很多的包 原因&#xff1a; 比如说vue&#xff0c;vue内部有依赖了其余的包。工具又依赖了别的依赖 造成的问题&#xff1a;我可以直接去用这个包&#xff0c;但是这个包在package.json中却没有看到-----幽灵依赖 那如果说别…

Python 绘图入门

数据可视化的概念及意义 数据可视化有着久远的历史&#xff0c;最早可以追溯至10世纪&#xff0c;至今已经应用和发展了数百年。不知名的天文学家是已知的最早尝试以图形方式显示全年当中太阳&#xff0c;月亮和行星的位置变化的图。 图1 数据可视化的发展历程 什么是数据可视…

就医陪诊小程序项目开发功能介绍

陪诊小程序通常是指一种通过智能手机应用程序提供陪同就医服务的平台。其主要功能可以包括 预约挂号服务&#xff1a; 用户可以通过小程序预约医院或特定科室的就诊时间&#xff0c;避免排队等待。 陪同就医&#xff1a; 提供专业的陪诊员工作&#xff0c;陪同用户到医院就诊&…

如何理解 Java 中的阻塞队列:从基础到高级的深度解析

提到阻塞队列&#xff0c;许多人脑海中会浮现出 BlockingQueue、ArrayBlockingQueue、LinkedBlockingQueue 和 SynchronousQueue。尽管这些实现看起来复杂&#xff0c;实际上阻塞队列本身的概念相对简单&#xff0c;真正挑战在于内部的 AQS&#xff08;Abstract Queuing Synchr…

javaweb_04:SpringBoot

一、SpringBoot快速入门 官网&#xff1a;https://spring.io/ spring提供了若干个子项目&#xff0c;每个项目用于完成特定的任务。 1、创建springboot工程&#xff0c;并勾选web开发相关依赖。 注意这里type要选成maven: 2、定义helloController类&#xff0c;添加方法h…