day23-测试自动化之Appium的滑动和拖拽事件、高级手势ActionChains、手机操作API

目录

一、滑动和拖拽事件

        1.1.应用场景

        1.2.swipe滑动事件

        1.3.scroll滑动事件

        1.4.drag_and_drop拖拽事件

        1.5.滑动和拖拽事件的选择

二、高级手势ActionChains

        2.1.应用场景

        2.2.使用步骤

        2.3.注意点

        2.4.方法

                1).手指轻敲操作 (掌握)

                2).手势按下和抬起操作(掌握)

                3).等待操作 (掌握)

                4).长按操作 (掌握)

                5).手指移动操作(掌握)

三、手机操作API

        3.1.获取手机分辨率 (掌握)

        3.2.手机截图 (掌握)

        3.3.获取和设置手机网络 (掌握)

        3.4.发送键到设备 (掌握)

        3.5.操作手机通知栏 (掌握)

四、今日学习思维导图

一、滑动和拖拽事件

        1.1.应用场景

                我们在做自动化测试的时候,有些按钮是需要滑动几次屏幕后才会出现,此时,我们需要使用代码来模拟手指的滑动,也就是我们将要学习的滑动和拖拽事件

        1.2.swipe滑动事件

                1).概念

                        从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动。

                2).方法

                        2.1).start_x:起点x轴坐标

                        2.2).start_y:起点Y轴坐标

                        2.3).end_x:终点x轴坐标

                        2.4).end_y:终点Y轴坐标

                        2.5).duration:清动这个操作一共持续的时间长度,单位:mS

                        2.6).driver.swipe(start_x,start_y,end_x, end_y.,duration=None)

                3).核心代码

                        driver.swipe(100,2000,100,1000)

                4).特点

                        4.1).参数是坐标点

                        4.2).持续时间短,惯性大

                        4.3).持续时间长,惯性小

                5).代码

python">import unittest
from time import sleepfrom appium import webdriver
from selenium.webdriver.common.by import By# 打开相册
capabilities = {}
capabilities['platformName'] = 'Android'
capabilities['automationName'] = 'uiautomator2'
capabilities['deviceName'] = 'Android'
capabilities['appPackage'] = 'com.android.settings'
capabilities['appActivity'] = '.Settings'
capabilities['language'] = 'en'
capabilities['locale'] = 'US'appium_server_url = 'http://localhost:4723'class TestAppium(unittest.TestCase):def setUp(self) -> None:# 获取driverself.driver = webdriver.Remote(appium_server_url,capabilities)self.driver.implicitly_wait(30)def tearDown(self) -> None:if self.driver:# 退出程序self.driver.quit()def test_find_battery(self) -> None:# 向下滑动一段距离# 获取窗口的宽和高height = self.driver.get_window_size().get('height')weight = self.driver.get_window_size().get('width')# 执行滑动操作self.driver.swipe(start_x=weight * 0.5,start_y=height * 0.8,end_x=weight * 0.5,end_y=height * 0.2, duration=2000)if __name__ == '__main__':unittest.main()

        1.3.scroll滑动事件

                1).概念

                        从一个元素滑动到另一个元素,直到页面自动停止。

                2).方法

                        2.1).origin_el:滑动开始的元素

                        2.2).destination_el:滑动结束的元素

                        2.3).driver.scroll(origin_el, destination_el)

                3).核心代码

                        save_button=driver.find_element_by_xpath(//°[@text='存f者']")more_button =driver.find_element_by_xpath("//*[@text='更多']")driver.scro11(save_button,more_button)

                4).小结

                        4.1).参数是元素

                        4.2).不能设置持续时间,惯性很大

                5).代码

python">import unittest
from time import sleepfrom appium import webdriver
from selenium.webdriver.common.by import By# 打开相册
capabilities = {}
capabilities['platformName'] = 'Android'
capabilities['automationName'] = 'uiautomator2'
capabilities['deviceName'] = 'Android'
capabilities['appPackage'] = 'com.android.settings'
capabilities['appActivity'] = '.Settings'
capabilities['language'] = 'en'
capabilities['locale'] = 'US'appium_server_url = 'http://localhost:4723'class TestAppium(unittest.TestCase):def setUp(self) -> None:# 获取driverself.driver = webdriver.Remote(appium_server_url,capabilities)self.driver.implicitly_wait(30)def tearDown(self) -> None:if self.driver:# 退出程序sleep(2)self.driver.quit()def test_find_battery(self) -> None:# 向下滑动一段距离# 获取batteryBattery = self.driver.find_element(By.XPATH, '//*[@text="Battery"]')Storage = self.driver.find_element(By.XPATH, '//*[@text="Storage"]')self.driver.scroll(Storage,Battery)if __name__ == '__main__':unittest.main()

        1.4.drag_and_drop拖拽事件

                1).概念

                        从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的位置。

                2).方法

                        2.1).origin_el:滑动开始的元素

                        2.2).destination_el:滑动结束的元素

                        2.3).driver.drag_and_drop(origin_el,destination_el)

                3).核心代码

                        save_button = driver.find_element_by_xpath(//[@text='存f’]")more_button =driver.find_element_by_xpath("//*[@text='更多’]")driver.drag_and_drop(save_button,more_button)

                4).小结

                        4.1).参数是元素

                        4.2).不能设置持续时间,没有惯性

                5).代码

python">import unittest
from time import sleepfrom appium import webdriver
from selenium.webdriver.common.by import By# 打开相册
capabilities = {}
capabilities['platformName'] = 'Android'
capabilities['automationName'] = 'uiautomator2'
capabilities['deviceName'] = 'Android'
capabilities['appPackage'] = 'com.android.settings'
capabilities['appActivity'] = '.Settings'
capabilities['language'] = 'en'
capabilities['locale'] = 'US'appium_server_url = 'http://localhost:4723'class TestAppium(unittest.TestCase):def setUp(self) -> None:# 获取driverself.driver = webdriver.Remote(appium_server_url,capabilities)self.driver.implicitly_wait(30)def tearDown(self) -> None:if self.driver:# 退出程序sleep(2)self.driver.quit()def test_find_battery(self) -> None:# 向下滑动一段距离# 获取batteryBattery = self.driver.find_element(By.XPATH, '//*[@text="Battery"]')Storage = self.driver.find_element(By.XPATH, '//*[@text="Storage"]')self.driver.drag_and_drop(Storage,Battery)if __name__ == '__main__':unittest.main()

        1.5.滑动和拖拽事件的选择

                1).滑动和拖拽无非就是考虑是否有“惯性”,以及传递的参数是“元素”还是“坐标”。

                2).可以分成以下四种情况

                        2.1).有“惯性”,传入“元素”--->scroll

                        2.2).无“惯性”,传入“元素”"----> drag_and_drop

                        2.3).有“惯性”,传入“坐标”-”---->Swipe,并且设置较短的duration时间

                        2.4).无“惯性”,传入“坐标”---->swipe,并且设置较长的duration时间

二、高级手势ActionChains

        2.1.应用场景

                ActionChains可以实现一些针对手势的操作,比如滑动、长按、拖动等。我们可以将这些基本手势组合成一个相对复杂的手势。比如,我们解锁手机或者一些应用软件都有手势解锁的这种方式。

        2.2.使用步骤

                1).创建ActionChains对象

                2).通过对象调用想执行的手势

                3).通过perform()执行动作

        2.3.注意点

                所有手势都要通过执行perform()函数才会运行。

        2.4.方法

                1).手指轻敲操作 (掌握)

                        1.1).应用场景

                                模拟手指对某个元素或坐标按下并快速抬起。比如,固定点击(100,100)的位置。

                        1.2).方法

                                1.element:元素

                                2.X:X坐标

                                3.y:y坐标

                                4.ActionChains(driver).click(element=None,x=None,y=None).perform()

                        1.3).核心代码

                                1.e1 = driver.find_element_by_xpath("//*[contains(@text, *wLAn')]")

                                2.ActionChains(driver).click(e1).perform()

                        1.4).代码 

python">import unittest
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChainsclass TestAppium(unittest.TestCase):def setUp(self) -> None:# 获取drivercapabilities = {'platformName': 'Android','automationName': 'uiautomator2','deviceName': 'Android','appPackage': 'com.android.settings','appActivity': '.Settings','language': 'en','locale': 'US','browserName': '',  # 添加这一行}appium_server_url = 'http://localhost:4723'self.driver = webdriver.Remote(appium_server_url, capabilities)self.driver.implicitly_wait(30)# 其他代码保持不变def test_find_battery(self) -> None:# 创建touchaction对象el = self.driver.find_element(By.XPATH, '//*[@text="Battery"]')actions = ActionChains(self.driver)  # 使用ActionChains替换TouchActionactions.click(el).perform()  # 使用actions.tap()替换TouchAction().tap()

                2).手势按下和抬起操作(掌握)

                        2.1).应用场景

                                模拟手指一直按下,模拟指抬起。可以用来组合成轻敲或长按的操作

                        2.2).方法

                                1.按下操作---->ActionChains(driver).click_and_hold(el=None,x=None,y=None).perform()

                                2.抬起操作---->ActionChains(driver).release().perform()

                        2.3).核心代码

                                1.ActionChains(driver).click_and_hold(x=650,y=650).perform()

                                2.time.sleep(2)

                                3.ActionChains(driver) .press(x=650, y=650).perform()

                        2.4).代码

python">import unittest
from time import sleep
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By# 打开设置
capabilities = {}
capabilities['platformName'] = 'Android'
capabilities['automationName'] = 'uiautomator2'
capabilities['deviceName'] = 'Android'
capabilities['appPackage'] = 'com.android.settings'
capabilities['appActivity'] = '.Settings'
capabilities['language'] = 'en'
capabilities['locale'] = 'US'
capabilities['browserName'] = ''appium_server_url = 'http://localhost:4723'class TestAppium(unittest.TestCase):def setUp(self) -> None:# 获取driverself.driver = webdriver.Remote(appium_server_url, capabilities)self.driver.implicitly_wait(30)def tearDown(self) -> None:if self.driver:# 退出程序sleep(2)self.driver.quit()def test_find_battery(self) -> None:# 创建touchaction对象el = self.driver.find_element(By.XPATH, '//*[@text="Battery"]')tc = ActionChains(self.driver)# 使用click_and_hold方法按住元素并保持tc.click_and_hold(el)# 使用pause方法指定按住的停顿时间2stc.pause(2)# 使用release方法松开tc.release()# 最后使用perform方法执行以上操作。tc.perform()if __name__ == '__main__':unittest.main()

                3).等待操作 (掌握)

                        3.1).应用场景

                                模拟手指等待

                        3.2).方法

                                ActionChains(driver).pause(time)--->time:秒

                        3.3).核心代码

                                ActionChains(driver).pause(2)

                        3.4).代码

python">import unittest
from time import sleep
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By# 打开设置
capabilities = {}
capabilities['platformName'] = 'Android'
capabilities['automationName'] = 'uiautomator2'
capabilities['deviceName'] = 'Android'
capabilities['appPackage'] = 'com.android.settings'
capabilities['appActivity'] = '.Settings'
capabilities['language'] = 'en'
capabilities['locale'] = 'US'
capabilities['browserName'] = ''appium_server_url = 'http://localhost:4723'class TestAppium(unittest.TestCase):def setUp(self) -> None:# 获取driverself.driver = webdriver.Remote(appium_server_url, capabilities)self.driver.implicitly_wait(30)def tearDown(self) -> None:if self.driver:# 退出程序sleep(2)self.driver.quit()def test_find_battery(self) -> None:# 创建touchaction对象el = self.driver.find_element(By.XPATH, '//*[@text="Battery"]')tc = ActionChains(self.driver)# 使用click_and_hold方法按住元素并保持tc.click_and_hold(el)# 使用pause方法指定按住的停顿时间2stc.pause(2)# 使用release方法松开tc.release()# 最后使用perform方法执行以上操作。tc.perform()if __name__ == '__main__':unittest.main()

                4).长按操作 (掌握)

                        4.1).应用场景

                                模拟手指对元素或坐标的长按操作。比如,长按某个按钮弹出菜单。

                        4.2).方法

                                ActionChains(driver).click_and_hold(e1=None, x=None, y=None, duration=1000) .perform()

                        4.3).核心代码

                                1.ActionChains(driver).click_and_hold(el=None,x=None,y=None).perform()

                                2.time.sleep(2)

                                3.AtionChains(driver).click_and_hold(el=None,x=None,y=None).release.perform()

                        4.4).代码

python">import unittest
from time import sleep
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By# 打开设置
capabilities = {}
capabilities['platformName'] = 'Android'
capabilities['automationName'] = 'uiautomator2'
capabilities['deviceName'] = 'Android'
capabilities['appPackage'] = 'com.android.settings'
capabilities['appActivity'] = '.Settings'
capabilities['language'] = 'en'
capabilities['locale'] = 'US'
capabilities['browserName'] = ''appium_server_url = 'http://localhost:4723'class TestAppium(unittest.TestCase):def setUp(self) -> None:# 获取driverself.driver = webdriver.Remote(appium_server_url, capabilities)self.driver.implicitly_wait(30)def tearDown(self) -> None:if self.driver:# 退出程序sleep(2)self.driver.quit()def test_find_battery(self) -> None:# 创建touchaction对象el = self.driver.find_element(By.XPATH, '//*[@text="Battery"]')tc = ActionChains(self.driver)# 使用click_and_hold方法按住元素并保持tc.click_and_hold(el)tc.perform()if __name__ == '__main__':unittest.main()

                5).手指移动操作(掌握)

                        5.1).应用场景

                                模拟手指移动操作,比如,手势解锁需要先按下,再移动

                        5.2).方法

                                ActionChains(driver).move_to_element_with_offset (x=None,y=None)

                        5.3).核心代码

                                AtionChains(driver).move_to_element_with_offset (x=None,y=None)

三、手机操作API

        3.1.获取手机分辨率 (掌握)

                1).应用场景

                        自动化测试可能会需要根据当前设置的屏幕分辨率来计算一些点击或者滑动的坐标

                2).方法

                        driver.get_window_size()

                3).核心代码

                        print(self.driver.get_window_size())

                4).代码

python">import unittest
from time import sleep
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By# 打开设置
capabilities = {}
capabilities['platformName'] = 'Android'
capabilities['automationName'] = 'uiautomator2'
capabilities['deviceName'] = 'Android'
capabilities['appPackage'] = 'com.android.settings'
capabilities['appActivity'] = '.Settings'
capabilities['language'] = 'en'
capabilities['locale'] = 'US'
capabilities['browserName'] = ''appium_server_url = 'http://localhost:4723'class TestAppium(unittest.TestCase):def setUp(self) -> None:# 获取driverself.driver = webdriver.Remote(appium_server_url, capabilities)self.driver.implicitly_wait(30)def tearDown(self) -> None:if self.driver:# 退出程序sleep(2)self.driver.quit()def test_find_battery(self) -> None:# 获取手机分辨率print(self.driver.get_window_size())if __name__ == '__main__':unittest.main()

        3.2.手机截图 (掌握)

                1).应用场景

                        有些自动化的操作可能没有反应,但并不报错,此时我们就可以将操作过后的关键情况,截图留存,后期也可以根据图片发现问题

                2).方法

                        driver.get_screenshot_as_file(filename)--->filename 指定路径下,指定格式的图片

                3).核心代码

                        driver.get_screenshot_as_file(./phone.png")

                4).代码

python">import unittest
from time import sleep
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By# 打开设置
capabilities = {}
capabilities['platformName'] = 'Android'
capabilities['automationName'] = 'uiautomator2'
capabilities['deviceName'] = 'Android'
capabilities['appPackage'] = 'com.android.settings'
capabilities['appActivity'] = '.Settings'
capabilities['language'] = 'en'
capabilities['locale'] = 'US'
capabilities['browserName'] = ''appium_server_url = 'http://localhost:4723'class TestAppium(unittest.TestCase):def setUp(self) -> None:# 获取driverself.driver = webdriver.Remote(appium_server_url, capabilities)self.driver.implicitly_wait(30)def tearDown(self) -> None:if self.driver:# 退出程序sleep(2)self.driver.quit()def test_find_battery(self) -> None:# 等待两秒钟sleep(2)# 截图self.driver.get_screenshot_as_file('./phone.png')if __name__ == '__main__':unittest.main()

        3.3.获取和设置手机网络 (掌握)

                1).应用场景

                        视频应用在使用流量看视频的时候,大部分都会提示用户正在是否继续播放。作为测试人员,我们可能需要用自动化的形式来判断是否有对应的提示。即,用流量的时候应该有提示,不用流量的时候应该没有提示。

                2).获取手机网络

                        2.1).方法

                                driver.network_connection

                        2.2).核心代码

                                print(driver.network_connection)

                        2.3).底层数字表示

                3).设置手机网络

                        3.1).方法

                                driver.set_network_connection(connection)

                        3.2).核心代码

                                driver.set_network_connection(2)

                4).代码

python">import unittest
from time import sleep
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By# 打开设置
capabilities = {}
capabilities['platformName'] = 'Android'
capabilities['automationName'] = 'uiautomator2'
capabilities['deviceName'] = 'Android'
capabilities['appPackage'] = 'com.android.settings'
capabilities['appActivity'] = '.Settings'
capabilities['language'] = 'en'
capabilities['locale'] = 'US'
capabilities['browserName'] = ''appium_server_url = 'http://localhost:4723'class TestAppium(unittest.TestCase):def setUp(self) -> None:# 获取driverself.driver = webdriver.Remote(appium_server_url, capabilities)self.driver.implicitly_wait(30)def tearDown(self) -> None:if self.driver:# 退出程序self.driver.quit()def test_find_battery(self) -> None:# 获取手机网络print(self.driver.network_connection)# 设置手机网络self.driver.set_network_connection(2)print(self.driver.network_connection)if __name__ == '__main__':unittest.main()

               5).注意

                        5.1).网络的类型,建议使用系统提供的类型

                        5.2).fromappium.webdriver.connectiontype import ConnectionType

        3.4.发送键到设备 (掌握)

                1).应用场景

                        模拟按“返回键”“home键”等等操作,比如,很多应用有按两次返回键退出应用的功能,如果这个功能需要我们做自动化,那么一定会用到这个方法

                2).方法

                        2.1).driver.press_keycode(keycode,metastate=None)

                        2.2).keycode:发送给设备的关键代码

                        2.3).metastate:关于被发送的关键代码的元信息,一般为默认值

                3).注意

                        按键对应的编码可以搜索androidkeycode

                4).核心代码

                        4.1).driver.press_keycode(24)

                        4.2).driver.press_keycode(24)

                        4.3).driver.press_keycode(24)

                        4.4).driver.press_keycode(4)

                        4.5).driver.press_keycode(25)

                        4.6).driver.press_keycode(25)

                5).代码

python">import unittest
from time import sleep
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By# 打开设置
capabilities = {}
capabilities['platformName'] = 'Android'
capabilities['automationName'] = 'uiautomator2'
capabilities['deviceName'] = 'Android'
capabilities['appPackage'] = 'com.android.settings'
capabilities['appActivity'] = '.Settings'
capabilities['language'] = 'en'
capabilities['locale'] = 'US'
capabilities['browserName'] = ''appium_server_url = 'http://localhost:4723'class TestAppium(unittest.TestCase):def setUp(self) -> None:# 获取driverself.driver = webdriver.Remote(appium_server_url, capabilities)self.driver.implicitly_wait(30)def tearDown(self) -> None:if self.driver:# 退出程序sleep(5)self.driver.quit()def test_find_battery(self) -> None:# 点击三次音量加,再点击返回,再点击两次音量减self.driver.press_keycode(24)self.driver.press_keycode(24)self.driver.press_keycode(24)sleep(2)self.driver.press_keycode(4)sleep(2)self.driver.press_keycode(25)self.driver.press_keycode(25)if __name__ == '__main__':unittest.main()

        3.5.操作手机通知栏 (掌握)

                1).应用场景

                        测试即时通信类软件的时候,如果A给B发送一条消息,B的通知栏肯定会显示对应的消息。我们想通过通知栏来判断B是否收到消息,一定要先操作手机的通知栏

                2).方法

                        driver.open_notifications()

                3).注意点

                        appium官方并没有为我们提供关闭通知的api,那么现实生活中怎么关闭,就怎样操作就行,比如,手指从下往上滑动,或者,按返回键

                4).核心代码

                        4.1).driver.open_notifications()--->打开通知栏

                        4.2).driver.press_keycode(4)---->关闭通知栏

                5).代码

python">import unittest
from time import sleep
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By# 打开设置
capabilities = {}
capabilities['platformName'] = 'Android'
capabilities['automationName'] = 'uiautomator2'
capabilities['deviceName'] = 'Android'
capabilities['appPackage'] = 'com.android.settings'
capabilities['appActivity'] = '.Settings'
capabilities['language'] = 'en'
capabilities['locale'] = 'US'
capabilities['browserName'] = ''appium_server_url = 'http://localhost:4723'class TestAppium(unittest.TestCase):def setUp(self) -> None:# 获取driverself.driver = webdriver.Remote(appium_server_url, capabilities)self.driver.implicitly_wait(30)def tearDown(self) -> None:if self.driver:# 退出程序sleep(5)self.driver.quit()def test_find_battery(self) -> None:# 打开通知栏self.driver.open_notifications()# 等待两秒钟sleep(2)# 关闭通知栏self.driver.press_keycode(4)if __name__ == '__main__':unittest.main()

四、今日学习思维导图


http://www.ppmy.cn/ops/97186.html

相关文章

响应式Web设计:纯HTML和CSS的实现技巧-1

响应式Web设计(Responsive Web Design, RWD)是一种旨在确保网站在不同设备和屏幕尺寸下都能良好运行的网页设计策略。通过纯HTML和CSS实现响应式设计,主要依赖于媒体查询(Media Queries)、灵活的布局、可伸缩的图片和字…

React 入门第一天:从Vue到React的初体验

作为一名合格的前端工程师,怎么能只会Vue呢?学习React不仅是一场新技术的探索,更是对前端开发思维的一次重新审视。在这里,我将分享学习React的心得,希望能帮助那些和我一样从Vue转向React的开发者。 1. 为什么选择Re…

playbook(剧本)基本应用、playbook常见语法、playbook和ansible操作的编排

playbook(剧本): 是ansible⽤于配置,部署,和管理被控节点的剧本。⽤ 于ansible操作的编排。 使⽤的格式为yaml格式 一、YMAL格式 以.yaml或.yml结尾 ⽂件的第⼀⾏以 "---"开始,表明YMAL⽂件的开始(可选的) 以#号开头为注释 列表中的所有成员都开始于…

思特科技案例:北京欢乐谷光影乐园

01      在北京欢乐谷的亲子领域,藏着一处“面积近400平米,炫酷堪比魔法世界的、美轮美奂的光影空间,做到了“让娃来了不想走,一玩就是一下午”。    思特科技案例:北京欢乐谷光影乐园      02      作…

STM32之SPI读写W25Q128芯片

SPI简介 STM32的SPI是一个串行外设接口。它允许STM32微控制器与其他设备(如传感器、存储器等)进行高速、全双工、同步的串行通信。通常包含SCLK(串行时钟)、MOSI(主设备输出/从设备输入Master Output Slave Input&…

Godot关于fbx格式文件导入

查看文档fbx格式是支持,看我的文件也是存在,就是在编辑器中文件系统找不到。解决方案如下 确保你开启了fbx导入,之后自动重启就可以导入了,unity的模型也可以用。什么立方体胶囊之类的。

水利机械5G智能制造工厂物联数字孪生平台,推进制造业数字化转型

在当今这个科技日新月异的时代,水利机械行业正经历着一场深刻的变革,其中5G智能制造工厂物联数字孪生平台的引入,无疑是推动制造业数字化转型的重要驱动力。工业物联数字孪生平台是智能制造工厂的核心组成部分,它基于物理世界的真…

高性能日志系统 代理模式构建全局日志器获取接口

日志器获取接口 通过两个函数,用于获取指定名称的日志器和root日志器。两个函数分别通过调用loggerManager的getInstance方法,获取单例的日志管理器对象,通过这种方式,借助日志管理器获取具体的日志器对象。 设计的主要目的&…

打卡学习Python爬虫第三天|python的re模块的使用

如何在python程序中使用正则表达式?就是使用re模块 re模块使用: 1、findall查找所有,返回list list re.findall("n","I love learning English and Chinese!") print(list) # 输出结果:[n,n,n,n,n] list…

Epic Games 商店面向欧盟 iPhone 用户上线

Epic Games Store 终于在欧盟推出,为玩家提供了不通过 App Store 就能在 iPhone上访问游戏的途径。在经历了漫长而昂贵的关于支付和竞争对手应用程序店面的法律战,以及公证方面的麻烦之后,Epic Games 成功地为App Store 带来了一个数字店面。…

【pyqt5】QLineEdit中的文本输入限制方式,输入校验规则的应用详解

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

【Pyspark-驯化】一文搞懂Pyspark中表连接的使用技巧

【Pyspark-驯化】一文搞懂Pyspark中表连接的使用技巧 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 相关内容文档获取 微信公众号 &…

重复的DNA序列

题目链接 重复的DNA序列 题目描述 注意点 0 < s.length < 10^5s[i]‘A’、‘C’、‘G’ or ‘T’返回所有在 DNA 分子中出现不止一次的 长度为 10 的序列(子字符串) 解答思路 使用一个大小为10的滑动窗口存储该区间内的字符组成的字符串&#xff0c;使用哈希表存储任…

如何评估Redis的性能

导语 Redis是一款高性能的内存数据库&#xff0c;被广泛用于缓存、持久化、消息队列等各种场景。为了确保Redis的高性能运行&#xff0c;评估Redis的性能是非常重要的。本文将介绍如何评估Redis的性能&#xff0c;并从问题解决的角度探讨如何优化Redis的性能。 1. 性能评估指…

【前端基础篇】HTML零基础速通

文章目录 前言HTML结构认识HTML标签 HTML文件基本结构标签层次结构 快速生成代码框架HTML常见标签注释标签标题标签段落标签换行标签格式化标签图片标签超链接标签表格标签基本使用合并单元格 列表标签表单标签form标签input标签 label标签select标签textarea标签无语义标签 HT…

基于Python flask的岗位招聘数据分析系统,应用Python、Flask框架、Pyecharts、Wordcloud等技术

基于Python Flask的岗位招聘数据分析系统旨在为企业人力资源部门和求职者提供一个全面的数据分析平台&#xff0c;通过对招聘数据的深度挖掘和可视化展示&#xff0c;帮助用户做出更明智的决策。该系统采用了Python、Flask框架&#xff0c;并结合Pyecharts、Wordcloud等技术&am…

雪花算法理解(1高位+41位时间戳+10位机器位+12位自增序号) 及其使用豆包帮助下一个解决了时钟回拨的代码

背景&#xff1a; 为啥需要雪花算法呢&#xff1f; 1.我们是不希望用UUID的&#xff0c;因为它是字符串&#xff0c;不利于索引的建立。 2.字符串内存占用大。 3.游戏中&#xff0c;我们希望生成的id是有意义的&#xff0c;我们可以根据id去反推出一些业务信息。所以根据唯一的…

三生随记——暴雨之夜

第一章&#xff1a;暴雨将至 乌云如墨般在天空中翻涌&#xff0c;沉闷的雷声从远方传来&#xff0c;预示着一场暴雨即将降临。在这个繁华都市的角落里&#xff0c;年轻的画家林晓独自坐在她的工作室里&#xff0c;望着窗外阴沉的天色&#xff0c;心中涌起一股莫名的不安。 林…

微信小程序的遍历和事件的简单案例

遍历和事件的简单案例 在微信小程序中&#xff0c;你可以通过为组件添加事件来实现交互功能。当用户触发这些事件时&#xff0c;小程序会执行相应的处理函数。下面是一个示例&#xff0c;展示如何在微信小程序中遍历标签并为其添加点击事件&#xff1a; <view><view …

一起学习LeetCode热题100道(49/100)

49.二叉树的最近公共祖先(学习) 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#…