当前位置: 首页 > news >正文

selenium

python+selenium

selenium是一个第三方库,python有很多库;

1、什么是ui自动化?

通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。

2、ui自动化的优点?

(1)解决重复性的功能测试和验证

(2)减少测试人员在回归测试时用例漏测和验证点的漏测

(3)减少冒烟测试,回归测试的人力成本,节省时间,提高测试效率

3、ui自动化缺点?

(1)需求不稳定,比如,敏捷开发速度快,ui频繁变更,定位不稳定,提高了用例维护的成本

(2)用例的覆盖率少,占用例总数的15%-30%

(3)场景覆盖占当前功能场景70%-80%

4、ui自动化和功能测试那个更重要?

都重要

原因:(1)功能测试是基础,在熟悉功能的前提下才能做好ui自动化

 

 安装方法1:

1、安装selenium命令(在dos命令中cmd  )

  pip  install    selenium==3.141.0  (python3中pip.exe默认在python的Scripts路径下)

2、可使用以下命令查看是否安装成功:

 pip   list

 2、直接把site--packages.rar包      selenium放进去

 

4、pycharm安装selenium

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

注意点:

1、如果安装报错:pip版本太低

解决方案:升级pip直接输入 : python -m pip install --upgrade pip

2、记得配置pip环境变量

3、安装出现pip 安装不是内部命令

解决:安装环境变量的问题,

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

1、谷歌驱动:放在C:\python37 下面

 对应版本镜像链接1:http://chromedriver.storage.googleapis.com/index.html 

对应版本镜像链接2:https://registry.npmmirror.com/binary.html?path=chromedriver/

谷歌下载低版本:https://downzen.com/en/windows/google-chrome/versions/ 不同版本的谷https://googlechromelabs.github.io/chrome-for-testing/#stable  最新版本Google驱动歌

 查看谷歌的版本:

 因为版本和驱动要对应

 将驱动放在python下

 注意点:

1、urllib3的版本过高 ,降低版本:1.26.10

 2、谷歌和驱动不对应,

3、谷歌会自动更新,关闭自动更新

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

调用语句格式:

第一步:导入  from      selenium   import      webdriver 

第二步:创建一个driver对象来打开浏览器,对浏览器实现操作

driver = webdriver.Chrome()

第三步:通过对象谷歌浏览器且输入网址,在用get方法来打开一个网站的url

driver.get('http://gz.duoceshi.cn')

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

打开页面方法:

方法一:格式 driver.get( " url")

场景1:driver.get("www.baidu.com")

方法二: 格式:driver.execute_script("window.open('url')")

场景1:driver.execute_script("window.open('http://www.jd.com')")
场景2:和场景1一样的
window='window.open("http://www.jd.com")'#可以通过变量来接收
driver.execute_script(window)#执行脚本

1

2

3

4

5

6

7

8

9

10

# from  selenium import webdriver  #导入selenium 模块中webdriver

# from time import *   #导入时间模块

# dx=webdriver.Chrome()  #创建一个对象来打开浏览器webdriver 接对应的浏览器

# dx.get("https://www.baidu.com/") #通过父对象中的get方法去打开网址

# sleep(2) #休眠2秒

# # dx.get("https://www.jd.com/")

# w="window.open('https://www.jd.com/')"  #重开窗口

# dx.execute_script(w)  #执行重开窗口脚本呢

# sleep(10)

# dx.close() #关闭当前窗口

  

拓展知识:

window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+

格式:window.open(pageURL,name,parameters) 

 pageURL 为子窗口路径 ,name 为子窗口句柄,parameters 为窗口参数(各参数用逗号分隔) 

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

1、时间等待中的三种

1.1强制等待 sleep(xx)                    例如:time.sleep(10)

1.2.隐性等待 implicitly_wait(xx)           例如:driver.implicitly_wait(10)

1.3.显性等待 WebDriverWait

1

2

3

4

5

6

7

# from  selenium import webdriver  #导入selenium 模块中webdriver

# from time import *   #导入时间模块

# dx=webdriver.Chrome()  #创建一个对象来打开浏览器webdriver 接对应的浏览器

# dx.get("https://www.baidu.com/") #通过父对象中的get方法去打开网址

# sleep(10) #强制等待

# # dx.implicitly_wait(10) #隐性等待

# print(1)

  

2、drivere.refresh(  )   页面刷新

案例:

1

2

3

4

5

from time import *   #导入时间模块

dx=webdriver.Chrome()  #创建一个对象来打开浏览器webdriver 接对应的浏览器

dx.get("https://www.baidu.com/"#通过父对象中的get方法去打开网址

sleep(3)

dx.refresh() #刷新

  

3、3.1driver.back( )  #返回上一页

1

2

3

4

5

6

7

8

from  selenium import webdriver  #导入selenium 模块中webdriver

from time import *   #导入时间模块

dx=webdriver.Chrome()  #创建一个对象来打开浏览器webdriver 接对应的浏览器

dx.get("https://www.baidu.com/"#通过父对象中的get方法去打开网址

sleep(3)

dx.get("https://www.jd.com/")

sleep(3)

dx.back()  # 返回上一页

  

3.2 driver.forward(   )#切换到下一页

1

2

3

4

5

6

7

8

9

10

from  selenium import webdriver  #导入selenium 模块中webdriver

from time import *   #导入时间模块

dx=webdriver.Chrome()  #创建一个对象来打开浏览器webdriver 接对应的浏览器

dx.get("https://www.baidu.com/"#通过父对象中的get方法去打开网址

sleep(3)

dx.get("https://www.jd.com/")

sleep(3)

dx.back()  # 返回上一页

sleep(3)

dx.forward() #切换到下一页

  

4、driver.set_window_size(  530,960)  #设置指定窗口的大小

1

2

3

4

5

6

from  selenium import webdriver  #导入selenium 模块中webdriver

from time import *   #导入时间模块

dx=webdriver.Chrome()  #创建一个对象来打开浏览器webdriver 接对应的浏览器

dx.get("https://www.baidu.com/"#通过父对象中的get方法去打开网址

sleep(3)

dx.set_window_size(500,500)

  

5、driver.maxmize_window( ) #窗口最大化

1

2

3

4

5

6

from  selenium import webdriver  #导入selenium 模块中webdriver

from time import *   #导入时间模块

dx=webdriver.Chrome()  #创建一个对象来打开浏览器webdriver 接对应的浏览器

dx.get("https://www.baidu.com/"#通过父对象中的get方法去打开网址

sleep(3)

dx.maximize_window()

  

7、driver.get_screenshot_as_file(保存路径,图片名称)     截屏

1

2

3

4

5

6

from  selenium import webdriver  #导入selenium 模块中webdriver

from time import *   #导入时间模块

dx=webdriver.Chrome()  #创建一个对象来打开浏览器webdriver 接对应的浏览器

dx.get("https://www.baidu.com/"#通过父对象中的get方法去打开网址

sleep(3)

dx.get_screenshot_as_file(r"E:\ls\aa.png")

 

8、退出的两种方式:一种是close  ,另一种:quit

from  selenium import webdriver  #导入selenium 模块中webdriver
from time import *   #导入时间模块
dx=webdriver.Chrome()  #创建一个对象来打开浏览器webdriver 接对应的浏览器
dx.get("https://www.baidu.com/") #通过父对象中的get方法去打开网址
sleep(3)
w="window.open('https://www.jd.com/')"  #重开窗口
dx.execute_script(w)  #执行重开窗口脚本呢
# dx.close() # 关闭当前窗口
dx.quit()

  

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

定位方法:

 讲解实例

查看定位属性:

F12或者开发者工具查看页面元素

场景1:id 定位,比如定位百度的输入框

格式:driver.find_element_by_id('id值')

1

2

3

from selenium import webdriver

driver=webdriver.Chrome()

driver.get("http://www.baidu.com")driver.find_element_by_id('kw'#定位iddriver.find_element_by_id("kw").send_keys("我是name定位")  

 场景2:name定位方法,比如百度输入框中找name

格式:driver.find_element_by_name("name值")

复制代码

复制代码

from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_name("wd")
time.sleep(3)
driver.find_element_by_name("wd").send_keys("杭州dcs")

复制代码

复制代码

场景3:class定位,以百度中class为例

格式:driver.find_element_by_class_name('class值')

1

2

3

4

5

from selenium import webdriver

import time

driver=webdriver.Chrome()

driver.get("http://www.baidu.com")

driver.find_element_by_class_name('s_ipt').send_keys("class定位")  

场景4:link_text定位     #使用click()点击方法   准确的匹配    点击a标签

格式:driver.find_element_by_link_text('值').click()

1

2

3

4

from selenium import webdriver

driver=webdriver.Chrome()

driver.get('http://www.baidu.com')

driver.find_element_by_link_text('hao123').click()  

场景5:partial_link_text  标签模糊定位

格式:driver.find_element_by_partial_link_text('模糊值').click() 

1

2

3

4

from selenium import webdriver

driver=webdriver.Chrome()

driver.get('http://www.baidu.com')

driver.find_element_by_partial_link_text('ao').click()  

 场景6:javascript 定位

格式:driver.execute_script('document.getElementById("id值").value="输入的值"')

1

2

3

4

5

6

from selenium import webdriver

from time import sleep

driver=webdriver.Chrome()

driver.get('http://www.baidu.com')

js ='document.getElementById("kw").value="js定位方法"'

driver.execute_script(js)  

拓展知识:(不讲解)

1

2

3

4

5

id定位:document.getElementById()

name定位:document.getElementsByName()

tag定位:document.getElementsByTagName()

class定位:document.getElementsByClassName()

css定位:document.querySelectorAll()

 场景7:tag_naem定位(标签定位)

格式:drvier.find_elements_by_tag_name('input')

1

2

3

4

5

6

7

8

9

# from selenium import webdriver

# import time

# driver=webdriver.Chrome()

# driver.get("http://www.baidu.com")

inputs =drvier.find_elements_by_tag_name('input')

# # 通过elements来找到当前百度中所有的input标签

for in inputs: #遍历input标签

     if i.get_attribute('name')=='wd':

        i.send_keys('多测师name') 

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

 场景8:xpath定位 (详解)

格式:driver.find_element_by_xpath(xpath表达式)

两个定位:

1、绝对定位:

特点:1.以单斜杠/开头;2.从页面根元素(HTML标签)开始,严格按照元素在HTML页面中的位置和顺序向下查找

如:/html/body/div[2]/div[1]/div[5]/div/div/form/span[1]/input

2、相对定位:(我们一般都是用相对定位来定位的)

特点:1.以双斜杠//开头;2.不考虑元素在页面当中的绝对路径和位置;3.只考虑是否存在符合表达式的元素即可。

2.1使用标签名+节点属性定位

语法://标签名[@属性名=属性值]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

# from selenium import webdriver<br># from time import sleep #导入time模块引用sleep线程等待<br># driver=webdriver.Chrome() #创建一个对象公司用谷歌那么就调用谷歌浏览器<br># url='http://www.baidu.com' # 测试环境地址<br># driver.get(url) #通过谷歌浏览器打开百度网站<br># driver.maximize_window() #窗口最大化<br># sleep(2) #线程等待#直接复制的方法

xpath=drvier.find_element_by_xpath('//*[@id="kw"]')

xpath.send_keys('直接id复制是xpath')

# 直接手写且引用当前标签中已有的元素

# 引用:id 除了xpath元素中必须要添加单或者双引号其它都不需要

xpath =drvier.find_element_by_xpath('//*[@id="kw"]')

xpath.send_keys('直接id复制是xpath')

# 通过标签名称来

xpath =drvier.find_element_by_xpath('//input[@id="kw"]')

xpath.send_keys('通过input标签名')

# 通过name元素来实现

xpath =drvier.find_element_by_xpath('//*[@name="wd"]')

xpath.send_keys('xpath中name定位')

# 通过class元素来定位

xpath=drvier.find_element_by_xpath('//*[@class="s_ipt"]')

xpath.send_keys('xpath中class元素定位!')

# 通过:autocomplete="off"元素来定位

xpath=drvier.find_element_by_xpath('//*[@autocomplete="off"]')

xpath.send_keys('xpath中其他属性定位')

# 通过and来实现定位

xpath=drvier.find_element_by_xpath('//*[@name="wd" and @class="s_ipt"]')

xpath.send_keys('多个组合属性定位xpath')

1

2

3

##from://*[@id="form"]

#span://*[@id="form"]/span[1]

#   //*[@id="kw"] #'''xpath定位的写法'''<br># # 找父级的方法(通过标签找到指定定位的元素)<br># # 当前输入框的标签是:input标签-我要定位的地址在这个地址中输入文本<br># # input标签的上一级是:span标签<br># # 当找父级无法找到的时候:找父级的爷爷级# xpath=driver.find_element_by_xpath('//*[@id="form"]/span/input')<br># xpath.send_keys('根据层级查找定位')<br>#xpath=driver.find_element_by_xpath('//*[@id="form"]/span[1]/a[1]')<br># xpath.send_keys('多测师!!!')<br><br>索引值从1开始,

  

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

场景9:css定位(详解)

格式:driver.find_element_by_css_selector('值')

9.1场景css中使用

复制代码

复制代码

from selenium import webdriver
from time import sleep #导入time模块引用sleep线程等待
driver=webdriver.Chrome() #创建一个对象公司用谷歌那么就调用谷歌浏览器
url='http://www.baidu.com' # 测试环境地址
driver.get(url) #通过谷歌浏览器打开百度网站
driver.maximize_window() #窗口最大化
sleep(2) #线程等待

复制代码

复制代码

from  selenium import webdriver  #导入selenium 模块中webdriver
from time import *   #导入时间模块
dx=webdriver.Chrome()  #创建一个对象来打开浏览器webdriver 接对应的浏览器
dx.get("https://www.baidu.com/") #通过父对象中的get方法去打开网址
sleep(3)
dx.maximize_window()
sleep(2)
dx.find_element_by_css_selector("#form>span>input").send_keys("层级定位上两级")
# dx.find_element_by_css_selector("#form > span.bg.s_ipt_wr.new-pmd.quickdelete-wrap>input").send_keys("层级上一级定位")
# dx.find_element_by_css_selector('[name="wd"][class="s_ipt"]').send_keys("css中的组合属性")
# dx.find_element_by_css_selector('[name="wd"]').send_keys("css中的name定位")
# dx.find_element_by_css_selector('[class="s_ipt"]').send_keys("css中的class全称定位")
# dx.find_element_by_css_selector(".s_ipt").send_keys("css中的class简写定位")
# dx.find_element_by_css_selector('[id="kw"]').send_keys("css中的id全称定位")
# dx.find_element_by_css_selector("#kw").send_keys("css中的id简写定位")

总结:

Python+Selenium 实现UI自动化元素定位总结

在这9种常用的定位方法中,优先顺序

1)有id优先使用id定位

2)没有id,考虑使用name或者class定位。

3)如果没有id,name,class再考虑用xpath,css定位。

4)如果是链接可以考虑使用link_text,partial_link_text 定位。

5)tag_name和JavaScript还是用的比较少的,我们根据实际情况,具体问题具体分析

拓展知识:(不讲解)

elements是复数,返回的是一个列表

1

2

3

4

5

6

7

8

0.id复数定位find_elements_by_id(self, id_)

1.name复数定位find_elements_by_name(self, name)

2.class复数定位find_elements_by_class_name(self, name)

3.tag复数定位find_elements_by_tag_name(self, name)

4.link复数定位find_elements_by_link_text(self, text)

5.partial_link复数定位find_elements_by_partial_link_text(self, link_text)

6.xpath复数定位find_elements_by_xpath(self, xpath)

7.css复数定位find_elements_by_css_selector(self, css_selector

方法一:driver.find_elements("css selector", ".mnav")[5].click()

方法二:driver.find_elements_by_class_name("mnav")[5].click()

注意从索引0开始

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

1

2

3

4

5

6

7

8

9

10

11

成功登陆cms案例(输入账号,输入密码,点击登陆)<br>from  selenium  import webdriver

from time  import  sleep

driver=webdriver.Chrome()

url="http://cms.duoceshi.cn/cms/manage/login.do"

driver.get(url)

sleep(3)

driver.find_element_by_id("userAccount").send_keys("admin")

sleep(3)

driver.find_element_by_id("loginPwd").send_keys("123456")

sleep(2)

driver.find_element_by_id("loginBtn").click()

 案例:

1

2

3

4

5

6

7

8

9

10

链接点击<br>from  selenium  import  webdriver<br>from  time import  sleep<br>dx=webdriver.Chrome()<br>dx.get("http://baidu.com")<br>dx.maximize_window()<br>dx.find_element_by_link_text("hao123").click()<br><br>按钮的点击:

from  selenium  import  webdriver

from  time import  sleep

dx=webdriver.Chrome()

dx.get("http://baidu.com")

dx.maximize_window()

dx.find_element_by_id("kw").send_keys("dcs")

sleep(2)

dx.find_element_by_id("su").click() # 按钮的点击

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

案例1:

from  selenium  import  webdriver
from  selenium.webdriver.common.action_chains import ActionChains
from  time import  sleep
dx=webdriver.Chrome()
dx.get("http://baidu.com")
dx.maximize_window()
sz=dx.find_element_by_name("tj_briicon")
ActionChains(dx).move_to_element(sz).perform()
sleep(2)
dx.find_element_by_xpath('//*[@id="s-top-more"]/div[2]/a').click()

 案例2:(非悬停动作)

from  selenium  import  webdriver
from  selenium.webdriver.common.action_chains import ActionChains
from  time import  sleep
dx=webdriver.Chrome()
dx.get("http://baidu.com")
dx.maximize_window()
sleep(2)
dx.find_element_by_id("s-usersetting-top").click()
sleep(2)
dx.find_element_by_link_text("高级搜索").click()

案例3:

from  selenium  import  webdriver
from  selenium.webdriver.common.action_chains import ActionChains
from  time import  sleep
dx=webdriver.Chrome()
dx.get("http://baidu.com")
dx.maximize_window()
sleep(2)
sz=dx.find_element_by_id("s-usersetting-top")
ActionChains(dx).move_to_element(sz).perform()
dx.find_element_by_link_text("高级搜索").click()

'''

ActionChains()括号中接当前浏览器对象

move_to_element()括号中接当前你要模拟悬停的具体元素位置

.perform()对当前的位置进行点击悬停(类似于鼠标放在上面的动作)'''sleep(4)<br>driver.find_element_by_link_text('搜索设置').click()

拓展知识:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

ActionChains类(鼠标操作)

常用于模拟鼠标的行为,比如单击、双击、拖拽等行为

       click(on_element=None)     --- 鼠标单击

       double_click(on_element=None)    ---  双击      

       context_click(on_element=None)   ---  右击      

       click_and_hold(on_element=None)   ---  鼠标单击并且按住不放

       drag_and_drop(source,target)   ---  拖拽

       drag_and_drop_by_offset(source,xoffset,yoffset)   ---  将目标拖动到指定的位置

       key_down(value,element=None)  ---  按下某个键盘上的键

       key_up(value,element=None)   ---  松开某个键

       move_by_offset(xoffset,yoffset)   ---  鼠标从当前位置移动到某个坐标

       move_to_element(to_element)   ---  鼠标移动到某个元素

       move_to_element_with_offset(to_element,xoffset,yoffset)  

---  移动到距某个元素(左上角坐标)多少距离的位置

       perform()    ---  执行链中的所有动作

       release(on_element=None)   ---  在某个元素位置松开鼠标左

1

2

3

4

5

6

7

8

9

10

11

获取文本

from  selenium  import  webdriver

from  time import  sleep

dx=webdriver.Chrome()

dx.get("http://baidu.com")

wb=dx.find_element_by_name("tj_briicon").text

print(wb)

if  wb=="更多!":

    print("ok")

else:

    print("no")<br><br>获取当前标题<br>案例1:(覆盖窗口)显示标题# from  selenium  import  webdriver<br># from  time import  sleep<br># dx=webdriver.Chrome()<br># dx.get("http://baidu.com")<br># print(dx.title)  #print(dx.title)  #<br># sleep(2)<br># dx.get("http://jd.com")<br># print(dx.title) #京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!案例2:(重开窗口,显示标题,title同一个)from  selenium  import  webdriver<br>from  time import  sleep<br>dx=webdriver.Chrome()<br>dx.get("http://baidu.com")<br>print(dx.title)  #print(dx.title)  #<br>sleep(2)<br>w="window.open('https://www.jd.com/')"  #重开窗口<br>dx.execute_script(w)  #执行重开窗口脚本呢<br>print(dx.title)a=5<br>assert a<1   #assert  错误就直接抛异常,正确就执行下一句语句<br>print("成功")<br><br><br>下拉框定位:<br>案例网址:https://yz.chsi.com.cn/zsml/zyfx_search.jsp  考试网<br>案例:https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/select<br>案例:html   <br>file:///E:/dcs/two/selenium/select.html<br>导入一个类:from  selenium.webdriver.support.select import Select<br>案例:from  selenium import  webdriver<br>from  selenium.webdriver.support.select import Select<br>dx=webdriver.Chrome()<br>dx.get("https://yz.chsi.com.cn/zsml/zyfx_search.jsp")<br>wz=dx.find_element_by_id("ssdm")<br>Select(wz).select_by_index(2) #通过索引定位,从0开始计算<br># Select(wz).select_by_visible_text("(14)山西省") #通过文本定位<br># Select(wz).select_by_value("15") #通过value值定位

作用:判断表达式的条件成不成立,如果不成立就会立刻返回错误,而不用等到程序执行完成崩溃后,<br>其相当于if not 表达式<br><br>assert()方法,断言成功,则程序继续执行,断言失败,则程序报<br>案例一:

弹框的讲解:

1

alert弹框;<br>file:///E:/dcs/two/selenium/%E5%BC%B9%E6%A1%86/alert%E5%BC%B9%E6%A1%86.html<br>案例1

from  selenium import  webdriver
from  selenium.webdriver.support.select import Select
from  time import  *
dx=webdriver.Chrome()
dx.get("file:///E:/dcs/two/selenium/%E5%BC%B9%E6%A1%86/alert%E5%BC%B9%E6%A1%86.html")
# sleep(2)
tk=dx.switch_to.alert   # 切换弹框
tk.dismiss() # 点击取消
sleep(2)
tk.accept() #点击确定案例2:确认型弹框
file:///E:/dcs/two/selenium/%E5%BC%B9%E6%A1%86/enter.html
from  selenium import  webdriver
from  selenium.webdriver.support.select import Select
from  time import  *
dx=webdriver.Chrome()
dx.get("file:///E:/dcs/two/selenium/%E5%BC%B9%E6%A1%86/enter.html")
sleep(2)
dx.find_element_by_class_name("alert").click()  #点击确认按钮
sleep(2)
tk=dx.switch_to.alert #切换大弹框中
tk.accept()
案例3:输入型弹框
from  selenium import  webdriver
from  selenium.webdriver.support.select import Select
from  time import  *
dx=webdriver.Chrome()
dx.get("file:///E:/dcs/two/selenium/%E5%BC%B9%E6%A1%86/prompt.html")
sleep(2)
dx.find_element_by_class_name("alert").click()  #点击确认按钮
sleep(2)
tk=dx.switch_to.alert #切换大弹框中
tk.send_keys("dcs")
tk.accept()
案例4:上传文件类型
url="file:///E:/dcs/two/selenium/%E5%BC%B9%E6%A1%86/upload_file.html"
from  selenium import  webdriver
from  selenium.webdriver.support.select import Select
from  time import  *
dx=webdriver.Chrome()
dx.get("file:///E:/dcs/two/selenium/%E5%BC%B9%E6%A1%86/upload_file.html")
sleep(2)
dx.find_element_by_id("file").send_keys(r"E:\dcs\two\selenium\弹框")  #点击确认按钮
案例5:frame框

iframe框处理

定位的元素在iframe标签里面,需要先进入iframe,再进行元素定位

进入iframe框方法:switch_to.frame()

退出iframe框方法:switch_to.default_content()

实战案例一:https://mail.163.com/

实战案例二:用QQ登录京东网站方法:可以通过xpath,tag_name,索引等方法定位iframe框

注意:定位的iframe里面包含iframe,我们需要使用多次switch_to.frame(),从外一层一层进入,退出的时候使用一次switch_to.default_content()就可退出到最外面一层

url:https://graph.qq.com/oauth2.0/show?which=Login&display=pc&response_type=code&state=BA37720A1FA67A45EE4FD5112589FA446813433F240AE3CA836176C96D0C3E51F1E922097B5EF30226679AF8197B94F0&client_id=100273020&redirect_uri=https%3A%2F%2Fqq.jd.com%2Fnew%2Fqq%2Fcallback.action%3Fuuid%3Df13bd6404a7044b4af0324d73b026ca7

 案例:

from  selenium import  webdriver
from  selenium.webdriver.support.select import Select
from  time import  *
dx=webdriver.Chrome()
dx.get("https://graph.qq.com/oauth2.0/show?which=Login&display=pc&response_type=code&state=BA37720A1FA67A45EE4FD5112589FA446813433F240AE3CA836176C96D0C3E51F1E922097B5EF30226679AF8197B94F0&client_id=100273020&redirect_uri=https%3A%2F%2Fqq.jd.com%2Fnew%2Fqq%2Fcallback.action%3Fuuid%3Df13bd6404a7044b4af0324d73b026ca7")
sleep(2)
wz=dx.find_element_by_id("ptlogin_iframe")
dx.switch_to.frame(wz)
sleep(2)
dx.find_element_by_link_text("密码登录").click()
sleep(2)
dx.switch_to.default_content()#退框
dx.find_element_by_link_text("服务协议").click()

1

表单讲解:<br>案例6:<br>url:file:///E:/dcs/two/selenium/%E5%BC%B9%E6%A1%86/table.html<br>案例:

 

 表单:

selenium import  webdriver
from  selenium.webdriver.support.select import Select
from  time import  *
dx=webdriver.Chrome()
dx.get("file:///E:/dcs/two/selenium/%E5%BC%B9%E6%A1%86/table.html")
dx.find_element_by_name("user").send_keys("admin")
dx.find_element_by_name("passwd").send_keys("123456")
sleep(2)
dx.find_element_by_name("conpasswd").send_keys("123456")
sleep(2)
dx.find_element_by_xpath("/html/body/form/table/tbody/tr[5]/td[2]/input[1]").click()
sleep(2)
dx.find_element_by_xpath("/html/body/form/table/tbody/tr[6]/td[2]/input[2]").click()
sleep(2)
wz=dx.find_element_by_xpath("/html/body/form/table/tbody/tr[7]/td[2]/select")
Select(wz).select_by_visible_text("北京大学")
sleep(2)
dx.find_element_by_xpath("/html/body/form/table/tbody/tr[8]/th/input[2]").click()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

场景一:<br>from selenium import webdriver

from time import sleep

drvier=webdriver.Chrome()

drvier.get('http://www.jd.com')

drvier.maximize_window()

sleep(4)

# # 滚动条定位

='window.scrollTo(0,10000)'

# # 0表示为顶端,1000表示从顶端往下滑动的距离

# # (距离没有参考自己把握)

drvier.execute_script(j)

sleep(2)

='window.scrollTo(0,0)' #返回顶端

drvier.execute_script(j)

方法2:

from  selenium import  webdriver
from  selenium.webdriver.support.select import Select
from  time import  *
dx=webdriver.Chrome()
dx.get("https://www.jd.com/")
dx.maximize_window()
js="var d=document.documentElement.scrollTop=1000"
dx.execute_script(js)
sleep(3)
js1="var d=document.documentElement.scrollTop=0"
dx.execute_script(js1)

场景二: '''先把上面的滑动语法吸收:<br># 根据我们之前所学的Python 来实现自动增加的滑动<br># 

设置一个值为:5000  从0开始依次加1000 当满足5000的时候终止<br>

from  selenium import  webdriver
from  selenium.webdriver.support.select import Select
from  time import  *
dx=webdriver.Chrome()
dx.get("https://www.jd.com/")
dx.maximize_window()
n=0
while n<=3000:n+=1000
js="var d=document.documentElement.scrollTop="+str(n)
dx.execute_script(js)

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

场景二:模拟键盘操作

from selenium.webdriver.common.keys import Keys #导入Keys类)

from selenium import webdriver

import time

from selenium.webdriver.common.keys import Keys #导入Keys类

driver=webdriver.Chrome()

url='http://www.baidu.com'

driver.get(url)

driver.maximize_window()

time.sleep(4)

# Keys:模拟我们电脑的键盘操作(快捷键,全部选择,剪切,粘贴,空格,回车。。。)

driver.find_element_by_id('kw').send_keys('duoceshi')

time.sleep(3)

# # control+a全部选择

driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a')

time.sleep(3)

# control+x剪切

driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x')

time.sleep(3)

# control+v粘贴

driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'v')

# enter回车

driver.find_element_by_id('kw').send_keys(Keys.ENTER)

# 把以上的代码进行通过函数来封装

from  selenium import  webdriver
from  selenium.webdriver.support.select import Select
from   selenium.webdriver.common.keys import Keys
from  time import  *
dx=webdriver.Chrome()
dx.get("https://www.baidu.com/")
dx.maximize_window()
sleep(2)
def  kp(wz,*yz):dx.find_element_by_id(wz).send_keys(yz)sleep(2)
if __name__ == '__main__':kp("kw", "dcs")  #输入
kp("kw",Keys.CONTROL,"a") #全选
kp("kw", Keys.CONTROL, "x") #剪切
kp("kw", Keys.CONTROL, "v") #黏贴
kp("kw", Keys.ENTER) #确认

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

'''

练习:

1、将论坛的登录还有点击模块管理 通过类来进行封装(给实参)

2、将论坛的登录还有点击模块管理 用例封装(给形参)且通过类的传递完成调用 

 加一个断言 

'''

# from selenium import webdriver

# from time import sleep

# class Discuz: #定义一个类

#     def __init__(self):

#         self.drvier=webdriver.Chrome()

#         self.drvier.get('http://192.168.254.129/bbs/forum.php')

#         self.drvier.maximize_window()

#         self.drvier.implicitly_wait(10)

#     def login(self,name,pwd): #登录模块

#         self.drvier.find_element_by_id('ls_username').send_keys(name)

#         self.drvier.find_element_by_id('ls_password').send_keys(pwd)

#         sleep(2)

#         self.drvier.find_element_by_css_selector('.pn').click()

#     def mk_login(self): #模块管理

#         self.login('admin','123456')

#         self.drvier.find_element_by_link_text('模块管理').click()

#         sleep(2)

#         title=self.drvier.title

#         # print(title)

#         if title=='门户 - Discuz! Board - Powered by Discuz!':

#             print('模块管理中心OK') #模块管理中心OK

#         else:

#             print('NO')

#         sleep(4)

#         self.drvier.close()

# if __name__ == '__main__':

#     D=Discuz()

#     # D.login()

#     D.mk_login()

1

2

3

##from://*[@id="form"]

#span://*[@id="form"]/span[1]

#   //*[@id="kw"] #'''xpath定位的写法'''<br># # 找父级的方法(通过标签找到指定定位的元素)<br># # 当前输入框的标签是:input标签-我要定位的地址在这个地址中输入文本<br># # input标签的上一级是:span标签<br># # 当找父级无法找到的时候:找父级的爷爷级# xpath=driver.find_element_by_xpath('//*[@id="form"]/span/input')<br># xpath.send_keys('根据层级查找定位')<br>#xpath=driver.find_element_by_xpath('//*[@id="form"]/span[1]/a[1]')<br># xpath.send_keys('多测师!!!')<br><br>索引值从1开始,

 

1

切换窗口<br>1、当出现两个窗口的情况 ,根据索引切换from  selenium import webdriver  #导入selenium 模块中webdriver

相关文章:

selenium

pythonselenium selenium是一个第三方库&#xff0c;python有很多库&#xff1b; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式&#xff0c;用代码去实现自动化操作和验证的行为。 2、ui自动化的优点&#xff1f; &#xff08;1&#xff09;解决重复性的功能测试…...

网络安全:设备原理与操作

设备型号概述 网络安全企业有哪些&#xff1f; 国外&#xff1a;思科&#xff0c;Juniper&#xff0c;惠普&#xff0c;3Com&#xff0c;。。。。 国内&#xff1a;华为&#xff0c;中性&#xff0c;锐捷&#xff0c;蓝盾&#xff0c;绿盟&#xff0c;山石网科&#xff0c;36…...

pytorch中nn.Conv2d详解及参数设置原则

文章目录 基础参数1. in_channels (输入通道数)2. out_channels (输出通道数)3. kernel_size (卷积核大小)4. stride (步幅)5. padding (填充)6. dilation (膨胀)7. groups (分组卷积)8. bias (偏置) 如何设置参数&#xff1f;1. **in_channels 和 out_channels&#xff08;输入…...

select下拉框,首次进入页面没有显示value的情况

bug场景&#xff1a; 类似这种bug情况排查如下&#xff1a; 首先 理解含义 options就是存放键值对的&#xff0c;id就是key&#xff0c;对上了它就自动把label显示 而且如果你用来当作key和label的字段&#xff0c;与后端返回的不一致&#xff0c;还可以进行更改 其次 排查接…...

接口项目操作图-thinkphp6-rabbitmq

一、用户开户流程 用户首次需要联系商务开通账户&#xff0c;需要提供手机号及来访问的IP。开好户之后&#xff0c;平台方将提供用户访问的key值及header头部参数的公钥加密文件、body访问参数以及返回数据的公私钥加解密文件。 二、用户请求流程 用户将拿到的key值进行rsa公钥…...

thinkphp6.0常用设计模式实例

单例模式 (Singleton) 场景&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 实际业务&#xff1a;数据库连接、日志记录器、配置管理等。 ThinkPHP 6.0 实现&#xff1a; namespace app\common;class DatabaseConnection {private static $instance …...

微服务保护——Sentinel

什么是微服务保护&#xff1f; 微服务保护是一系列用于保障微服务架构稳定、可靠运行的策略与技术手段&#xff0c;在复杂的分布式微服务系统里&#xff0c;它能避免局部故障引发连锁反应&#xff0c;从而维持整个系统的可用性&#xff0c;主要涵盖以下几个关键部分&#xff1a…...

php 多进程那点事,用 swoole 如何解决呢 ?

在 PHP 中&#xff0c;多进程的处理通常会遇到一些挑战&#xff0c;比如资源共享、进程间通信、性能优化等。Swoole 是一个高性能的协程和多进程框架&#xff0c;旨在为 PHP 提供异步、并发、协程等功能&#xff0c;解决了传统 PHP 环境中的多进程管理问题。通过使用 Swoole&am…...

STM32+ADC+DMA快速循环转换

测试平台&#xff1a;STM32F405RGT6 uint32_t AD_Buf[100]{0}; HAL_ADC_Start_DMA(&hadc2,(uint32_t *)AD_Buf,100); while(1) {printf("AD_Buf:%d\n",AD_Buf[0]); }...

移动电商的崛起与革新:以开源AI智能名片2+1链动模式S2B2C商城小程序为例的深度剖析

摘要&#xff1a;本文旨在探讨移动电商的崛起背景、特点及其对传统电商模式的革新影响&#xff0c;并以开源AI智能名片21链动模式S2B2C商城小程序为具体案例&#xff0c;深入分析其在移动电商领域的创新实践。随着移动互联网技术的飞速发展&#xff0c;移动电商已成为电商行业的…...

QT实现 端口扫描暂停和继续功能 3

上篇QT给端口扫描工程增加线程2-CSDN博客 为按钮pushButton_Stop添加clicked事件&#xff0c;功能为暂停扫描&#xff0c;并在暂停后显示继续按钮&#xff0c;点击继续按钮之后继续扫描 1.更新UI 添加继续按钮 点击转到槽则会自动声明 2. 更新 MainWindow.h 需要新增的部分…...

C_字符数组存储汉字字符串及其索引

字符串就是字符数组&#xff0c;可以定义一个char类型的数组来存储字符串。 如果要存储多个字符串则可以定义一个char类型的二维数组。 存储多个汉字字符串的话&#xff0c;可以考虑用char类型的二维数组。 不过要注意&#xff0c;一个汉字在内存中占用的字节数确实大于一个…...

Linux标准IOday1

1:思维导图 2:将 student.c这个练习题&#xff0c;改成链表后实现 头文件link.h #ifndef __STRUCT_H__ #define __STRUCT_H__ #include <stdio.h> #include <stdlib.h> typedef struct Student{char name[20];double math;double chinese;double english;double…...

SEO内容优化:如何通过用户需求赢得搜索引擎青睐?

在谷歌SEO优化中&#xff0c;内容一直是最重要的因素之一。但要想让内容真正发挥作用&#xff0c;关键在于满足用户需求&#xff0c;而不是简单地堆砌关键词。谷歌的算法越来越智能化&#xff0c;更注重用户体验和内容的实用性。 了解目标用户的需求。通过工具如Google Trends…...

API调用淘宝京东商品详情接口示例参考,json格式数据示例

以下是API调用淘宝和京东商品详情接口的JSON格式数据示例&#xff1a; 淘宝商品详情接口JSON数据示例 淘宝商品详情接口&#xff08;通常称为item_get或类似的名称&#xff09;是淘宝开放平台提供的一个API接口&#xff0c;允许开发者根据商品的ID&#xff08;Item ID&#x…...

css实现垂直文本

效果 知识 writing-mode: <value>; 可选值 horizontal-tb: 默认值。文本从左到右&#xff08;或从右到左&#xff09;排列&#xff0c;然后从上到下。vertical-rl: 文本从上到下排列&#xff0c;然后从右到左。适用于垂直书写的方向&#xff0c;如日语和中文。vertica…...

【AI日记】25.01.07

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI 参加&#xff1a;kaggle 比赛 Forecasting Sticker Sales 读书 书名&#xff1a;国家为什么会失败阅读原因&#xff1a;2024 年诺贝尔经济学奖得主的力作&#xff0c;之前我已经读过他另一…...

logback日志

一、使用两个以上spring环境变量做三目操作 <springProperty name"application_name" scope"context" source"spring.application.name"/><springProperty name"trace_app_name" scope"context" source"sprin…...

Android NDK开发入门3之基本语法

JNI语法基础 函数生成语法&#xff1a; extern “ C” 作⽤&#xff1a;避免编绎器按照C的⽅式去编绎C函数 1、C不⽀持函数的重载&#xff0c;编译之后函数名不变&#xff1b; 2、C⽀持函数的重载&#xff08;这点与Java⼀致&#xff09;&#xff0c;编译之后函数名会改变…...

unity学习9:unity的Asset 导入和导出

目录 1 Assets 资产/资源 1.1 编辑器里Assets 和explorer文件夹 里一一对应 1.2 在编辑器里操作&#xff0c;和文件夹内操作&#xff0c;多数相同还是有些不同 2 往Assets里导入零散文件 2.1 往Assets里导入零散文件 2.2 把fbx文件导入到hierarcy /scene 里&#xff0c;…...

Unity学习笔记(七)使用状态机重构角色攻击

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 攻击状态重构 首先我们重构攻击状态的动画 之前的动画&#xff0c;我们是使用状态(isAttacking)攻击次数(comboCounter)完成动画的过渡&#xff0c;这样虽然能完成功能&#xff0c;但是如…...

【整理集合大全】MySQL(4) 数据库增删改查SQL语句

查看数据库 show databases; 使用数据库 use 数据库名;创建数据库 CREATE DATABASE 数据库名;删除数据库 DROP DATABASE 数据库名;创建表 create table 表名(列名1 类型(长度) [约束],列名2 类型(长度) [约束],…… );长度区别 int类型带长度&#xff1a;不影响存取值&…...

Flutter 鸿蒙化 flutter和鸿蒙next混和渲染

前言导读 这一个节课我们讲一下PlatformView的是使用 我们在实战中有可能出现了在鸿蒙next只加载一部分Flutter的情况 我们今天就讲一下这种情况具体实现要使用到我们的PlatformView 效果图 具体实现: 一、Native侧 使用 DevEco Studio工具打开 platform_view_example\oho…...

Flask返回浏览器无乱码方法

# -*- coding: utf-8 -*- from flask import Flask, request, jsonify, Response import os import json import re from datetime import datetime import logging import sys import crawling_web_knowledgeapp Flask(__name__)app.json.ensure_ascii False # 解决中文乱码…...

Tauri教程-基础篇-第二节 Tauri的核心概念下篇

“如果结果不如你所愿&#xff0c;就在尘埃落定前奋力一搏。”——《夏目友人帐》 “有些事不是看到了希望才去坚持&#xff0c;而是因为坚持才会看到希望。”——《十宗罪》 “维持现状意味着空耗你的努力和生命。”——纪伯伦 Tauri 技术教程 * 第四章 Tauri的基础教程 第二节…...

直播预告|StarRocks 3.4,打造 AI 时代的智能数据基座,应用场景全面扩展

随着新年的到来&#xff0c;StarRocks 3.4 即将上线&#xff0c;为 AI Workload 和更多应用场景提供强大支持&#xff01;此次升级聚焦于提升 AI 场景支持&#xff0c;并扩展更多应用场景&#xff0c;全方位提升数据分析体验。 更强的 AI 场景支持&#xff1a; 引入 Vector In…...

Maven的基本使用

Maven apache 旗下的开源项目&#xff0c;是一款用于管理构建Java的项目的工具 一 作用 1依赖管理&#xff1a;管理jar包&#xff0c;避免依赖冲突 2统一项目结构 &#xff1a; 3项目构建&#xff1a; 二 安装 下面是全球唯一的中央仓库 https://repo1.maven.org/maven2…...

【深度学习入门_基础篇】线性代数本质

开坑本部分主要为基础知识复习&#xff0c;新开坑中&#xff0c;学习记录自用。 学习目标&#xff1a; 熟悉向量、线性组合、线性变换、基变换、矩阵运算、逆函数、秩、列空间、零空间、范式、特征指、特征向量等含义与应用。 强烈推荐此视频&#xff1a; 【官方双语/合集】…...

数据库模型全解析:从文档存储到搜索引擎

目录 前言1. 文档存储&#xff08;Document Store&#xff09;1.1 概念与特点1.2 典型应用1.3 代表性数据库 2. 图数据库&#xff08;Graph DBMS&#xff09;2.1 概念与特点2.2 典型应用2.3 代表性数据库 3. 原生 XML 数据库&#xff08;Native XML DBMS&#xff09;3.1 概念与…...

LED背光驱动芯片RT9293应用电路

一&#xff09;简介&#xff1a; RT9293 是一款高频、异步的 Boost 升压型 LED 定电流驱动控制器&#xff0c;其工作原理如下&#xff1a; 1&#xff09;基本电路结构及原理 RT9293的主要功能为上图的Q1. Boost 电路核心原理&#xff1a;基于电感和电容的特性实现升压功能。当…...

Ubuntu挂载云盘操作步骤

1. 查看磁盘分区情况 使用 fdisk -l 命令查看当前系统中所有磁盘的分区情况&#xff0c;找到需要挂载的云盘设备&#xff0c;例如/dev/vdc。 2. 创建新分区 使用 fdisk /dev/vdc 命令对云盘进行分区操作&#xff1a; 输入n创建新分区。 输入p选择创建主分区。 输入1指定分区…...

【中间件】docker+kafka单节点部署---zookeeper模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言消息中间件介绍1. KRaft模式2. zookeeper模式2.1. 单节点部署安装验证 前言 最近生产环境上准备部署ELFK日志监控&#xff0c;先在测试环境部署单节点kafka验证…...

Arduino IDE刷微控制器并下载对应固件的原由

在使用Arduino IDE刷写某个微控制器时&#xff0c;下载对应的固件通常是为了确保微控制器能够正确识别和执行Arduino IDE中编写的代码。以下是对这一过程的详细解释&#xff1a; 一、固件的作用 固件是微控制器或嵌入式设备上运行的软件&#xff0c;它负责控制硬件设备的操作…...

深兰科技董事长陈海波应邀为华东师大心理学专业师生做AI专题讲座

12月28日&#xff0c;应上海华东师范大学的邀请&#xff0c;上海市科协常委、上海交通大学博士生导师、深兰科技创始人兼董事长陈海波专程到校&#xff0c;为该校心理学专业的全体师生做了一场关于人工智能推动个人数字化未来的专题讲座。 他在演讲中&#xff0c;首先详细讲述了…...

iOS - 引用计数(ARC)

1. 基本数据结构 // 对象结构 struct objc_object {isa_t isa; // isa 指针&#xff0c;包含引用计数信息 };// isa 的位域结构 union isa_t {uintptr_t bits;struct {uintptr_t nonpointer : 1; // 是否启用优化的 isa 指针uintptr_t has_assoc : 1; // 是…...

【物联网原理与运用】知识点总结(上)

目录 名词解释汇总 第一章 物联网概述 1.1物联网的基本概念及演进 1.2 物联网的内涵 1.3 物联网的特性——泛在性 1.4 物联网的基本特征与属性&#xff08;五大功能域&#xff09; 1.5 物联网的体系结构 1.6 物联网的关键技术 1.7 物联网的应用领域 第二章 感知与识别技术 2.1 …...

Flux“炼丹炉”——fluxgym安装教程

一、介绍 这个炼丹炉目前可以训练除了flux-dev之外的其它模型&#xff0c;只需更改一个配置文件内容即可。重要的是训练时不需要提前进行图片裁剪、打标等前置工作&#xff0c;只需下图的三个步骤即可开始训练。它就是——fluxgym。 fluxgym&#xff1a;用于训练具有低 VRAM &…...

【Jsoncpp】manipulating JSON data in C++

源代码 #include <iostream> // 引入输入输出流库&#xff0c;用于标准输入输出操作 #include <fstream> // 引入文件流库&#xff0c;用于文件读写操作 #include <json/json.h> // 引入JSON库&#xff0c;用于解析和操作JSON数据using namespace std; …...

Ardupilot开源无人机之Geek SDK进展2024

Ardupilot开源无人机之Geek SDK进展202501 1. 源由2. 状态3. TODO3.1 跟踪目标框3.2 onnxruntime版本3.3 CUDA 11.8版本3.4 pytorch v2.5.1版本3.5 Inference性能3.6 特定目标集Training 4. 参考资料 1. 源由 前期搭建《Ardupilot开源无人机之Geek SDK》&#xff0c;主要目的是…...

肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)

大家好&#xff01;我是凯哥&#xff0c;今天给大家分享一下云计算学习路线图。这是我按照自己最开始学习云计算的时候的学习路线&#xff0c;并且结合自己从业多年所涉及的知识精心总结的云计算的思维导图。这是凯哥精心总结的&#xff0c;花费了不少精力哦&#xff0c;希望对…...

配置数据的抗辐照加固方法

SRAM 型FPGA 的配置存储器可以看成是由0 和1 组成的二维阵列&#xff0c;帧的高度为矩阵阵列的高度&#xff0c;相同结构的配置帧组成配置列&#xff0c;如CLB 列、IOB 列、输入输出互联(Input Output Interconnect,IOI)列、全局时钟(Global Clock, GCLK)列、BRAM 列和BRAM 互联…...

【linux系统之redis6】处理可视化工具无法连接服务器端的redis

redis跑在虚拟机上的linux系统是可以正常的&#xff0c;但是用宿主机的可视化工具链接就连不上 可视化工具无法连接 问题排查 确保配置文件开启了bind 0.0.0.0,允许外部任何终端的链接密码确保正确要关闭linux系统的防火墙(我的属于这种) systemctl stop firewalld.servic…...

云计算操作系统的核心-OpenStack框架全解析

文章目录 一、OpenStack简介二、OpenStack架构1.认证服务Keystone2.镜像服务Glance3.计算服务Nova4.块存储服务Clinder5.对象存储服务Swift6.网络服务Neutron7.计量服务Ceilometer 三、服务简介3.1 OpenStack界面管理3.2 Keystone 认证3.3 Glance3.3 Nova3.4 存储服务3.5 Neutr…...

【设计模式-2】23 种设计模式的分类和功能

在软件工程领域&#xff0c;设计模式是解决常见设计问题的经典方案。1994 年&#xff0c;Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides&#xff08;四人帮&#xff0c;GoF&#xff09;在《设计模式&#xff1a;可复用面向对象软件的基础》一书中系统性地总结了…...

记录一下Coding一直不能clone

配置 下载git客户端&#xff0c;进行配置 git config --list user.name姓名全称 user.emailIAM_xxxxxx.com ,这个就是你的邮箱地址 user.signingkey 注册coding平台的密码 一般不需要配置公钥私钥 下载TortoiseGit&#xff0c;配置这几个参数 配置凭据管理器 注意 这里用户名是…...

Backend - C# EF Core 执行迁移 Migrate

目录 一、创建Postgre数据库 二、安装包 &#xff08;一&#xff09;查看是否存在该安装包 &#xff08;二&#xff09;安装所需包 三、执行迁移命令 1. 作用 2. 操作位置 3. 执行&#xff08;针对visual studio&#xff09; 查看迁移功能的常用命令&#xff1a; 查看…...

检索增强生成 和思维链 结合: 如何创建检索增强思维链 (RAT)?

论文地址&#xff1a;https://arxiv.org/pdf/2403.05313 Github地址&#xff1a;https://github.com/CraftJarvis/RAT 想象一下&#xff0c;一个人工智能助手可以像莎士比亚一样写作&#xff0c;像专家一样推理。这听起来很了不起&#xff0c;对吧&#xff1f;但是&#xff0…...

第四届电子信息与通信工程国际学术会议(EICE 2025)

第四届电子信息与通信工程国际学术会议&#xff08;EICE 2025&#xff09;定于2025年1月10日至12日在中国广州举行。大会交流全球相关领域科技学术最新发展趋势&#xff0c;链接重点领域国内外顶尖、活跃、最新学术资源&#xff0c;通过经验分享和智慧碰撞&#xff0c;推动科研…...

Hbuilder ios 离线打包sdk版本4.36,HbuilderX 4.36生成打包资源 问题记录

1、打包文档地址https://nativesupport.dcloud.net.cn/AppDocs/usesdk/ios.html#%E9%85%8D%E7%BD%AE%E5%BA%94%E7%94%A8%E7%89%88%E6%9C%AC%E5%8F%B7 2、配置应用图标 如果没有appicon文件&#xff0c;此时找到 Assets.xcassets 或者 Images.xcassets(看你sdk引入的启动文件中…...

HarmonyOS开发:传参方式

一、父子组件传参 1、父传子&#xff08;Prop方式&#xff09; 父组件代码 Entry Component struct ParentComponent {State parentMessage: string Hello from Parent;build() {Column() {ChildComponent({ message: this.parentMessage });}} } 子组件代码 Component s…...