最新要闻
- 播报:美股异动 | 爱立信(ERIC.US)跌超7% 警告成熟市场5G支出将继续缩减
- 天天观焦点:哈尔滨还要往北300公里 我国在建最北高铁站取得新进展
- 五一假期返程火车票今日开抢:千万别忘记
- 【环球报资讯】239元起!小米发布13大新品 价格信息这里一文看
- 当前观点:今天小米6发售6周年!雷军推荐“钉子户”升级小米13系列
- 焦点热讯:关于增加东莞银行股份有限公司为东方人工智能主题混合型证券投资基金销售机构同时开通定投及转换业务的公告
- 环球新消息丨312国道宁镇段快速化改造工程进入基层施工新阶段
- 世界信息:4月18日基金净值:招商瑞泰1年持有混合A最新净值1.0166,涨0.01%
- 环球焦点!俄罗斯石油被抢:沙特和阿联酋低价购入 再高价卖给欧洲
- 松下空调怎么样调睡眠模式 松下空调怎么样
- 关注一季度四川民生数据③丨一季度,四川CPI同比上涨1.2%
- 一图看懂九号电动远行者F90M:新国标能上牌 90km长续航
- 全球视点!3299元起 锐龙7000X3D游戏神U战未来:AMD、微软合作优化Win系统
- 199元!小米游戏手柄发布:支持Steam、三模连接
- 热门:2023刚过了100多天 从主流到高端手机都如何卷?
- 环球讯息:手慢无?苹果这些机型或许会在iPhone 15系列推出后停产
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
观察:实例讲解Playwright(二)
实例讲解Playwright(二)
网址 | 说明 |
---|---|
https://playwright.dev/ | 官网首页 |
https://playwright.dev/python/docs/intro | Python部分入口 |
https://github.com/microsoft/playwright-python | github,python入口 |
https://github.com/microsoft/playwright-python/releases | python部分的release notes |
本文基于 playwright 1.32.1 发布于 2023-3-30转载请注明出处,这是第二篇学习前你得有html、css、xpath等基础,最好有selenium基础,我是对比来讲解的
④Page|Locator对象能力
自动等待
案例
先看一段python代码
(相关资料图)
from selenium import webdriverdriver = webdriver.Chrome()driver.maximize_window()driver.get("http://121.5.150.55:8090/forum.php")driver.find_element("css selector",".pn.vm").click()driver.find_element("css selector","input[id^="seccodeverify_cSA"]").send_keys("admin")
这样是会报错的
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"input[id^="seccodeverify_cSA"]"}
因为第五行的click会弹出一个对话框,第六行要直接操作弹框中的input输入内容,而元素实际还没展现出来
在selenium中可以用等待来处理
三种等待均可
强制等待
...driver.find_element("css selector",".pn.vm").click()from time import sleepsleep(1)driver.find_element("css selector","input[id^="seccodeverify_cSA"]").send_keys("admin")
隐式等待
driver = webdriver.Chrome() # 这行后driver.implicitly_wait(5)
显式等待
code_input_locator = "css selector","input[id^="seccodeverify_cSA"]"from selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECWebDriverWait(driver,5,0.5).until(EC.visibility_of_element_located(code_input_locator)).send_keys("admin")
做了这么多铺垫来看看playwright的优势
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto("http://121.5.150.55:8090/forum.php") page.locator(".pn.vm").click() page.locator("input[id^="seccodeverify_cSA"]").fill("admin")
是的,你在代码中看不到任何的等待的
这是playwright给你做了,
特性
Playwright在对元素进行操作的时候会做一系列的可行性检查来确保这些前置条件能得到满足。
它会自动等待那些相关的条件通过,并只执行所需的动作。如果条件不满足,会提示超时,动作失败抛出TimeoutError
Playwright performs a range of actionability checks on the elements before making actions to ensure these actions behave as expected. It auto-waits for all the relevant checks to pass and only then performs the requested action. If the required checks do not pass within the given timeout, action fails with the TimeoutError
举个例子来说,点击一个元素之前,playwright会检查
- element is Attached to the DOM
- element is Visible
- element is Stable as in not animating or completed animation
- element Receives Events, as in not obscured by other elements
- element is Enabled
完整的列表如下
Action Attached Visible Stable Receives Events Enabled Editable check Yes Yes Yes Yes Yes - click Yes Yes Yes Yes Yes - dblclick Yes Yes Yes Yes Yes - setChecked Yes Yes Yes Yes Yes - tap Yes Yes Yes Yes Yes - uncheck Yes Yes Yes Yes Yes - hover Yes Yes Yes Yes - - scrollIntoViewIfNeeded Yes - Yes - - - screenshot Yes Yes Yes - - - fill Yes Yes - - Yes Yes selectText Yes Yes - - - - dispatchEvent Yes - - - - - focus Yes - - - - - getAttribute Yes - - - - - innerText Yes - - - - - innerHTML Yes - - - - - press Yes - - - - - setInputFiles Yes - - - - - selectOption Yes Yes - - Yes - textContent Yes - - - - - type Yes - - - - - 但你对Attached、Visible、Stable、Receives Events、Enabled、Editable是否有了解呢?
请参考附录
默认的自动等待时长是30s
示例代码
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto("http://121.5.150.55:8090/forum.php") page.locator(".pn.vm").click() page.locator("input[id="se"]").fill("admin") # 这个表达式无法定位到元素
最后你会看到报错
playwright._impl._api_types.TimeoutError: Timeout 30000ms exceeded.=========================== logs ===========================waiting for locator("input[id="se"]")============================================================
默认的30s实在有点太长了,怎么改呢
我走了一个弯路
def launch( ... timeout: typing.Optional[float] = None, ... timeout : Union[float, None] Maximum time in milliseconds to wait for the browser instance to start. Defaults to `30000` (30 seconds). Pass `0` to disable timeout.
说的好好的,但没有作用
browser = pw.chromium.launch(headless=False,timeout=5000)
还是30s超时了
答案是fill中也有个timeout,在这里去处理即可
page.locator("input[id="se"]").fill("admin",timeout=1000)
包括click也是有的
但问题是,全局的(应该有)找不到,那你写项目代码的时候就要浪费很多的参数
截图
这部分能力,页面对象有,元素对象也有
页面截图
示例代码
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto("https://www.runoob.com/") page.screenshot(path="runoob.png")
注意screenshot的参数必须以关键字方式传递,因为它是这样定义的。星号之后必须关键字方式传递
def screenshot( self, *, timeout: typing.Optional[float] = None, type: typing.Optional[Literal["jpeg", "png"]] = None, path: typing.Optional[typing.Union[str, pathlib.Path]] = None,
但这样的截图只有当前屏幕尺寸大小
像菜鸟教程这样的是长网页,就可以用到screenshot的参数了
全屏
示例代码
page.screenshot(path="runoob.png",full_page=True)
元素截图
实例代码
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto("http://114.116.2.138:8090/forum.php") page.locator(".pn.vm").screenshot(path="loginbutton.png")
bytes对象
这就可以用来验证码处理了
示例代码
login_button_bytes = page.locator(".pn.vm").screenshot() with open("loginbutton.png","wb") as f: f.write(login_button_bytes)
键盘操作
示例代码
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto("https://www.toptal.com/developers/keycode",timeout=80000) page.keyboard.press("Enter") page.wait_for_timeout(5000)
核心API是keyboard
它提供了以下API
方法 说明 down 键按下 up 键抬起 insert_text 插入文本 press 按键 type 输入 press的时候支持的按键有
F1 - F12, Digit0- Digit9, KeyA- KeyZ, Backquote, Minus, Equal, Backslash, Backspace, Tab, Delete, Escape, ArrowDown, End, Enter, Home, Insert, PageDown, PageUp, ArrowRight, ArrowUp 等等Shift, Control, Alt, Meta, ShiftLeft
示例代码1:演示了按键的典型操作
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto("http://114.116.2.138:8090/forum.php") page.click("#ls_username") page.keyboard.type("d") page.wait_for_timeout(3000) page.keyboard.press("ArrowLeft") page.wait_for_timeout(3000) page.keyboard.down("a") page.keyboard.up("a") page.wait_for_timeout(3000) page.keyboard.press("Control+A") page.wait_for_timeout(3000) page.keyboard.press("ArrowRight") page.wait_for_timeout(3000) page.keyboard.type("min",delay=100) page.wait_for_timeout(3000)
鼠标操作
单击、双击、右击
- 不像selenium,提供了一个context_click(右键),playwright是合并到click中的,如果要右击就提供button参数赋值为right即可
- 甚至还支持middle(中间键)
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto("http://sahitest.com/demo/clicks.htm") page.locator("[value="dbl click me"]").dblclick() page.locator("[value="click me"]").click() page.locator("[value="right click me"]").click(button="right") page.wait_for_timeout(5000)
参考官方的代码,你还可以shift点击右键(不清楚具体的含义了)
await page.locator(\"canvas\").click( button=\"right\", modifiers=[\"Shift\"], position={\"x\": 23, \"y\": 32} )
悬停
- 参考
实例六
,元素上做个hover即可
拖拽
就是drag_to,不过提供了target
示例代码
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto("http://sahitest.com/demo/dragDropMooTools.htm") items = page.locator(".item").all() for item in items: page.locator("#dragger").drag_to(item) page.wait_for_timeout(1000) page.wait_for_timeout(5000)
Alert对话框
示例网页
alert <script> function show_confirm() { var r=confirm("请选择!"); if (r==true) { document.write("你选择了确定!"); } else { document.write("你选择了取消!"); } } </script>
alert处理
示例代码
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto(r"D:\pythonProject\AutoTest\DemoPlaywright0413\demos\demo_alert.html") page.locator("#alert").click() page.wait_for_timeout(50000)
代码运行看你是没有点击的?
其实是点的,只是你看不到,playwright自己给你处理了
confirm处理
示例代码
page.locator("#confirm").click()page.wait_for_timeout(50000)
你可以看到网页
你选择了取消!
所以他是点的,但没有看到过程
但他默认是点击的取消,如果要点击确定呢?
示例代码
page.on("dialog",lambda dialog: dialog.accept()) page.locator("#confirm").click() page.wait_for_timeout(50000)
注意,区别很大的!
按照官方的说法
If there is no listener for page.on("dialog"), all dialogs are automatically dismissed.
这就可以介绍
alert处理
中为何看不到了,以及confirm处理
中一开始点击的是取消page.on是必须的,它一方面是做了一个监听,另外一方面是告诉你遇到了对话框后的动作
dialog.accept()
prompt处理
prompt较alert多了一个处理,要输入点内容
但搜下也没合适的答案,只能看看源码
源码
site-packages\playwright\_impl\_dialog.py
@property def type(self) -> str: return self._initializer["type"] @property def message(self) -> str: return self._initializer["message"] @property def default_value(self) -> str: return self._initializer["defaultValue"] async def accept(self, promptText: str = None) -> None: await self._channel.send("accept", locals_to_params(locals())) async def dismiss(self) -> None: await self._channel.send("dismiss")
所以我一开始想到的代码是
page.on("dialog",lambda dialog: dialog.accept(promptText="hello")) page.locator("#prompt").click() page.wait_for_timeout(50000)
TypeError: accept() got an unexpected keyword argument "promptText"
只能修改为
page.on("dialog",lambda dialog: dialog.accept("hello")) page.locator("#prompt").click() page.wait_for_timeout(50000)
解决了!界面上显示了
hello
消息文本的输出
对alert提示的文本要输出也比较简单
示例代码1
page.on("dialog",lambda dialog: print(dialog.message,dialog.type,dialog.default_value)) # 欢迎来到松勤软件测试 alert page.on("dialog",lambda dialog: dialog.accept()) page.locator("#alert").click() page.wait_for_timeout(3000)
这样是2个监听,有点多余
合并到一起,自定义一个函数
from playwright.sync_api import sync_playwright, Dialogdef handle_alert(dialog:Dialog): print("对话框类型:",dialog.type) print("对话框文本:",dialog.message) dialog.accept()with sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto(r"D:\pythonProject\AutoTest\DemoPlaywright0413\demos\demo_alert.html") page.on("dialog",handle_alert) page.locator("#alert").click() page.wait_for_timeout(3000)
- 总结下,playwright对alert是能自己处理的,alert只有确定,confirm和prompt都是取消!
- 你要在confirm和prompt中点击确定或者输入内容,需要加个监听器
- prompt的信息输入比较麻烦要在accept中加个字符串,还不能写参数名(好奇怪,没看太懂)
frame切换
示例html
Frame 用户名:
示例代码
page.frame_locator("#if").locator("#ls_username").fill("admin")
这比之selenium,简单很多
window管理
BrowserContexts提供了一个方式来操作多个独立的浏览器会话
如果一个页面打开另外一个页面(比如_blank属性的超链接),那么新打开的会依附于页面浏览器的上下文
Playwright通过browser.new_context()创建无痕浏览器上下文,无痕意味着不会写任何浏览器数据到磁盘中。
BrowserContexts provide a way to operate multiple independent browser sessions.If a page opens another page, e.g. with a window.open call, the popup will belong to the parent page"s browser context.Playwright allows creating "incognito" browser contexts with browser.new_context() method. "Incognito" browser contexts don"t write any browsing data to disk
示例代码1
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) context = browser.new_context() page = context.new_page() page.goto("https://www.baidu.com")
对比之前的代码
from playwright.sync_api import sync_playwrightwith sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto("http://114.116.2.138:8090/forum.php")
你可以看到运行效果是一样的,但是,你现在用context来打开一个new_page
而
.new_context()
的返回就是一个BrowserContext类示例代码2: 你可以看到在一个浏览器界面中打开了2个TAB,这2个是相互独立的
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) context = browser.new_context() page1 = context.new_page() page1.goto("https://www.baidu.com") page2 = context.new_page() page2.goto("https://cn.bing.com") page1.wait_for_timeout(5000) page2.wait_for_timeout(5000)
如何做页面切换呢?其实是非常简单的事情,关键在于context有个属性pages存储了你打开的这些页面
只是说往往我们新开的页面并不是你用context.new_page()产生的,而是你操作了网页(比如_blank属性的超链接)
示例HTML
NewWin 论坛示例代码3: 点击超链接后产生新的页面:论坛,在论坛中输入用户名
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) context = browser.new_context() page = context.new_page() page.goto(r"D:\pythonProject\AutoTest\DemoPlaywright0413\demos\demo_window.html") page.locator("a").click() context.pages[-1].locator("#ls_username").fill("admin") page.wait_for_timeout(5000)
这样会报错,默认超时时间30s,找不到元素,playwright的自动等待在这个地方就失效了
playwright._impl._api_types.TimeoutError: Timeout 30000ms exceeded.=========================== logs ===========================waiting for locator("#ls_username")============================================================
问题其实是
context.pages
并没有把新的窗口纳入进来,[-1]是假的其实就是[0],你如果写[1]就会在这部分代码上报错了# context.pages[1].locator("#ls_username").fill("admin")IndexError: list index out of range
解决方式一:加强等
page.locator("a").click() page.wait_for_timeout(1000) context.pages[-1].locator("#ls_username").fill("admin") page.wait_for_timeout(5000)
- 上面的代码有个缺陷,你做个selenium应该知道,这样的新开窗口是有延迟的,你等多久是个问题
解决方式二:
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) context = browser.new_context() page = context.new_page() page.goto(r"D:\pythonProject\AutoTest\DemoPlaywright0413\demos\demo_window.html") with context.expect_page() as new_page: page.locator("a").click() newpage = new_page.value # print(type(newpage)) #
newpage.locator("#ls_username").fill("admin")
文件上传
input类型单文件上传
示例代码
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto("http://121.41.14.39:8088/index.html") page.locator("#username").fill("sq1") page.locator("#password").fill("123") page.locator("#code").fill("999999") page.locator("#submitButton").click() page.wait_for_timeout(1000) page.reload() page.locator("xpath=//span[text()="文件上传"]").click() page.locator("//li[contains(text(),"单文件上传(input)")]").click() page.locator("#cover").set_input_files(r"d:\1.jpg") page.wait_for_timeout(5000)
页面的刷新page.reload()
文件上传page.locator("#cover").set_input_files(r"d:\1.jpg")
非input类型的文件上传
错误的代码(跟selenium是一样的)
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto("http://121.41.14.39:8088/index.html") page.locator("#username").fill("sq1") page.locator("#password").fill("123") page.locator("#code").fill("999999") page.locator("#submitButton").click() page.wait_for_timeout(1000) page.reload() page.locator("xpath=//span[text()="文件上传"]").click() page.locator("//li[contains(text(),"单文件上传(非input)")]").click() page.locator(".el-icon-upload").set_input_files(r"d:\1.jpg") page.wait_for_timeout(5000)
提示信息
playwright._impl._api_types.Error: Error: Node is not an HTMLInputElement
在selenium中是一样的,也不可以直接操作。
selenium中是可以借助第三方库来处理的
- pyautogui
- pywinauto
- pywin32
但playwright中是有自己的api来操作这部分的
示例代码
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto("http://121.41.14.39:8088/index.html") page.locator("#username").fill("sq1") page.locator("#password").fill("123") page.locator("#code").fill("999999") page.locator("#submitButton").click() page.wait_for_timeout(1000) page.reload() page.locator("xpath=//span[text()="文件上传"]").click() page.locator("//li[contains(text(),"单文件上传(非input)")]").click() with page.expect_file_chooser() as fc_info: page.locator(".el-icon-upload").click() file_chooser = fc_info.value file_chooser.set_files(r"d:\1.jpg") page.wait_for_timeout(5000)
多文件上传
多文件就简单了
示例代码
from playwright.sync_api import sync_playwrightwith sync_playwright() as pw: browser = pw.chromium.launch(headless=False) page = browser.new_page() page.goto("http://121.41.14.39:8088/index.html") page.locator("#username").fill("sq1") page.locator("#password").fill("123") page.locator("#code").fill("999999") page.locator("#submitButton").click() page.wait_for_timeout(1000) page.reload() page.locator("xpath=//span[text()="文件上传"]").click() page.locator("//li[contains(text(),"多文件上传(非input)")]").click() with page.expect_file_chooser() as fc_info: page.locator(".el-upload-dragger").click() file_chooser = fc_info.value file_chooser.set_files( files = [r"d:\1.jpg",r"d:\1.txt"] ) page.wait_for_timeout(5000)
关键词:
-
观察:实例讲解Playwright(二)
实例讲解Playwright(二)|网址|说明|||||https: playwright dev |官网首页||https: playwright dev pyth
来源: -
播报:美股异动 | 爱立信(ERIC.US)跌超7% 警告成熟市场5G支出将继续缩减
指股网获悉,4月18日(周二),爱立信(RIC U)股价走低,截至发稿,该股跌超7%,报5 495美元。该公司警告...
来源: 观察:实例讲解Playwright(二)
Mysql中的数据类型注意事项
观察:新华时评·首季经济形势|巩固企稳回升态势 推动经济运行持续整体好转
播报:美股异动 | 爱立信(ERIC.US)跌超7% 警告成熟市场5G支出将继续缩减
天天观焦点:哈尔滨还要往北300公里 我国在建最北高铁站取得新进展
五一假期返程火车票今日开抢:千万别忘记
【环球报资讯】239元起!小米发布13大新品 价格信息这里一文看
当前观点:今天小米6发售6周年!雷军推荐“钉子户”升级小米13系列
焦点热讯:关于增加东莞银行股份有限公司为东方人工智能主题混合型证券投资基金销售机构同时开通定投及转换业务的公告
今日热门!读SQL进阶教程笔记12_地址与三值逻辑
环球新消息丨312国道宁镇段快速化改造工程进入基层施工新阶段
世界信息:4月18日基金净值:招商瑞泰1年持有混合A最新净值1.0166,涨0.01%
环球焦点!俄罗斯石油被抢:沙特和阿联酋低价购入 再高价卖给欧洲
松下空调怎么样调睡眠模式 松下空调怎么样
Typora 1.5.12 (windows/MacOs版) 简单高效且实用的Markdown编辑器
环球速递!对JSP(Java Server Pages)的一些理解
关注一季度四川民生数据③丨一季度,四川CPI同比上涨1.2%
一图看懂九号电动远行者F90M:新国标能上牌 90km长续航
全球视点!3299元起 锐龙7000X3D游戏神U战未来:AMD、微软合作优化Win系统
199元!小米游戏手柄发布:支持Steam、三模连接
热门:2023刚过了100多天 从主流到高端手机都如何卷?
环球讯息:手慢无?苹果这些机型或许会在iPhone 15系列推出后停产
最新资讯:不拘一格降人才啥意思_不拘一格降人才
宣传好 贯彻好 实施好——甘肃省电力事体制改革势在必行
世界观察:三星s6818处理器_三星6818
焦点关注:郓城农商银行营业部:开展《反电信网络诈骗法》宣传活动
环球看点!择天记第二季
大专院校包括本科不_大专院校包括本科吗?
【环球新视野】纳税太贵玩家拒领终身XGP 日网假图令晓美焰风评被害
中国铁塔与苏交科战略合作签约仪式举行
北京长峰医院住院部东楼发生火情,情况通报
当前关注:马斯克官宣:将推出AI平台TruthGPT;五粮液成立新能源投资公司?工作人员:正在考察光伏和储能方面丨大公司动态
当前热讯:2023医学考博英语常见的内科词汇:泌尿及男性生殖系统
全球今热点:全面打响夏粮丰产丰收攻坚战
环球即时:04月19日周三机会早知道
世界微头条丨医疗纠纷投诉处理流程
【时快讯】铁塔能源联手品胜电子 推出全球首款电变分离式储能电源
信息:亚马逊加速欧洲扩张卖家只需点两下即可上架全部欧盟国家:亚马逊宣布推出欧洲急速拓展计划(EEA),卖家只需进行两次点击,即可将其业务快速拓展至亚马逊的9大欧
每日速读!Elasticsearch搜索功能的实现(一)--搜索引擎为什么选ES
高起_关于高起简述
最新快讯!饲养员拍打大熊猫被停工 多人求情:网友质疑处罚太重
全球播报:信贷紧缩与衰退预期急剧升温!华尔街最准策略师:极度悲观=风险资产反转信号
【天天热闻】“博客书记”张新实被逮捕,71 岁高龄因贪腐问题被查
当前视讯!02 设置工作环境与环境(一)
环球即时看!不坑盒子(Office,WPS接入人工智能)助你高效办公,掐点准时下班回家。
2023天津春秋喜乐汇相声观演指南
天天即时:环境保护局_关于环境保护局介绍
5999元起 安卓影像之王小米13 Ultra发布:高通发文祝贺
观察:499元 小米米家皮皮灯发布:支持手势操控
腾讯自研芯片“沧海”斩获8大全球第一:远超行业GPU
2600岁“古楠木王”被盗割:11人判刑、修复花费29万元
全球今头条!迷你主机卖到白菜价 零刻12代4核CPU准系统688元
天天微动态丨教你用Python画哆啦A梦、海绵宝宝、皮卡丘、史迪仔!
快资讯:R数据分析:生存数据的预测模型建立方法与评价
天天最新:[快讯]创世达公布2022年年度分红实施方案
环球关注:魔域手游直播(魔域手游蜘蛛刷新点)
淘汰8GB内存 小米13 Ultra售价仅5999元:良心升级不涨价
环球微资讯!小米13 Ultra首发环形冷泵散热:温控甩开一众友商
世界快讯:一图看懂小米13 Ultra:拍照巅峰!16GB+1TB只需7299元
环球聚焦:“童话大王”郑渊洁发告别书:维权难 不再发新作
【全球热闻】高端成了 用户暴买好评率超98%!雷军:小米加大创新 今年研发投入预计超200亿
环球热资讯!AI测试101:测试AI系统的实用技巧&ML和AI自动化工具
全球热资讯!Redis---主从复制
浙商证券汽车行业周报:特斯拉Q1交付超预期
给老外来点中国震撼!比亚迪展台被多名大众高管围观:都在看海鸥
7000mAh超大电池仅1799元!华为畅享60X图赏
今日播报!小米13 Ultra亮相:外观像极了相机!
世界快播:小米手机冲高端!小米MIX Fold 2好评率高达99.97%
环球速讯:小米13 Ultra、iPhone 14 Pro Max实拍对比出炉:徕卡光学YYDS
2023年社会工作者职业水平考试什么时间开考?
今日讯!《心渊梦境》多少钱?豪华版和标准版价格分享
定了!本田中国宣布2027年后不再投放燃油新车
王冰冰现身上海车展:跟演员王凯同台
当前视讯!出境易APP:轻松搞定出国必备应用 让你的海外之旅更便利!
【天天报资讯】“五一”出游正升温 文旅市场提前“入夏”
全球资讯:羡慕吗?厦门一公司取消所有法定长假调休:补班改休假 不鼓励加班
当前动态:自行车胎压多少合适 胎压多少合适
当前信息:jenkins配置maven编译tomcat项目并使用Nexus配置私库源
全球视点!比较几种热门Hybrid App前端框架
4月22日丨【云数据库技术沙龙】技术进化,让数据更智能
环球观天下!.net C#加载程序集外dll文件方法
【世界播资讯】ChatGPT们接踵而至,AI会彻底改变我们的工作方式吗?
天天新消息丨买不到票?无所谓全国游客会替你回家
市场期待消息和数据进一步指引 日债收益率小幅向上波动
【豫财经】河南上榜的是它!胡润发布2023全球独角兽榜
【环球新视野】和平精英s8赛季是什么时候开始的 和平精英ss8赛季是什么时候开始的
42.78万起售 新一代奔驰GLC上市:对比理想L9你买谁?
焦点热讯:电池级碳酸锂价格跌破20万/吨!十年后电动车价格再跌一半有戏
【天天报资讯】32GB仅794元 七彩虹银翼DDR5内存首发:超频能冲10GHz
环球快看:超好评国产OS!深度20.9正式发布:一切为了稳定
天天快资讯丨成龙、吴京首次同框!《龙马精神》中二人致敬龙虎武师精神
环球要闻:5G进入高速发展阶段,5GETF(159994)近期受到投资者关注,天孚通信、中际旭创、新易盛领涨
【天天热闻】Kubernetes集群调度增强之超容量扩容
每日短讯:Python精品书籍
环球即时看!用户隐私安全卫士——小程序沙箱
Portainer认识、安装、使用
使用openssl自签CA
市场监管总局批准启用激光小角度副基准装置
每日机构分析:4月18日
天天快资讯丨厦门港务:将进一步研究探讨新兴技术在智慧物流云平台等方面的应用