3.
标签内.
(2)表格的元素定位可以用xpath定位方式,比如:.//*[@id='myTable']/tbody/tr[2]/td[1]
需要说明的是,这里定位的格式是固定的,只需改tr和td后面的数字就可以了.如第二行第一列tr[2]td[1].
<例>from selenium import webdriver
url='file:///C:/Users/Gloria/Desktop/table.html'
driver=webdriver.Firefox()
driver.get(url)
t=driver.find_element_by_xpath(".//*[@id='myTable']/tbody/tr[2]/td[1]")
print t.text
13.加载Firefox配置:
(1)加载Chrome配置方法就是将username改成自己电脑的名字即可(不要用中文)
<例>'--user-data-dir=C:\Users\username\AppData\Local\Google\Chrome\User Data'
#coding:utf-8
from selenium import webdriver
#加载chrome配置
option=webdriver.ChromeOptions()
option.add_argument('--user-data-dir=C:\Users\Gloria\AppData\Local\Google\Chrome\User Data')
driver = webdriver.Chrome(chrome_options=option)
driver.implicitly_wait(30)
driver.get("http://www.cnblogs.com/yoyoketang/")
(2)wap测试:
<例>#coding:utf-8
from selenium import webdriver
option=webdriver.ChromeOptions()
#伪装iphone登录:
option.add_argment('--user-agent=iphone')
#伪装android登录:
option.add-argment('--user-agent=android')
driver=webdriver.Chrome(chrome_options=option)
driver.get('http://www.taobao.com')
14.富文本(richtext):
<例># coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
profileDir = r'C:\Users\Gloria\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'
profile = webdriver.FirefoxProfile(profileDir)
driver = webdriver.Firefox(profile)
bolgurl = "http://www.cnblogs.com/"
yoyobolg = bolgurl + "yoyoketang"
driver.get(yoyobolg)
driver.find_element_by_id("blog_nav_newpost").click()
time.sleep(5)
edittile = u"Selenium2+python自动化23-富文本"
editbody = u"这里是发帖的正文"
driver.find_element_by_id("Editor_Edit_txbTitle").send_keys(edittile)
driver.switch_to.frame("Editor_Edit_EditorBody_ifr")
driver.find_element_by_id("tinymce").send_keys(Keys.TAB)
driver.find_element_by_id("tinymce").send_keys(editbody)
15.非input文件上传(SendKeys):
(1)sendkeys安装步骤:
1.sendkeys安装:
输入命令:pip install sendkeys.
2.如果安装的时候报错:micsoft visual c++ is required.Get it from http://aka.ms/vcpython27.的时候,只需要按照 给定的路径http://aka.ms/vcpython27下载文件即可,然后一路安装即可。
3.如果出现successfully installed sendkeys_0.3字样的时候,则代表文件安装成功!
<例># coding:utf-8
from selenium import webdriver
import SendKeys
import time
# 加载Firefox配置
profileDir = r'C:\Users\xxxAppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'
profile = webdriver.FirefoxProfile(profileDir)
driver = webdriver.Firefox(profile)
# 加载Chrome配置
option = webdriver.ChromeOptions()
option.add_argument('--user-data-dir=C:\Users\xxxAppData\Local\Google\Chrome\User Data')
driver = webdriver.Chrome(chrome_options=option)
driver.implicitly_wait(30)
driver.get("http://www.cnblogs.com/yoyoketang/")
driver.find_element_by_link_text("新随笔").click()
time.sleep(3)
# 点开编辑器图片
driver.find_element_by_css_selector("img.mceIcon").click()
time.sleep(3)
# 定位所有iframe,取第二个
iframe = driver.find_elements_by_tag_name('iframe')[1]
# 切换到iframe上
driver.switch_to_frame(iframe)
# 文件路径
time.sleep(2)
driver.find_element_by_class_name("qq-upload-button").click()
# driver.find_element_by_name("file").click() # 这里点文件上传按钮也是一个坑,我用它父元素定位了,参 考上面一行
time.sleep(5)
# SendKeys方法输入内容
SendKeys.SendKeys("D:\\test\\jie1\\blog\\12.png") # 发送文件地址
time.sleep(1)
SendKeys.SendKeys("{ENTER}") # 发送回车键
time.sleep(1)
SendKeys.SendKeys("{ENTER}") # 因为我的电脑是搜索输入法,所以多按一次回车
driver.quit()
16.文件上传(send_keys):
文件上传是web页面上很常见的一个功能,一般分两个场景:一种是input标签,这种可以用selenium提供的send_keys()方法轻 松解决;另外一种非input标签实现起来比较困难,可以借助autoit工具或者SendKeys第三方库。
方法一:识别上传按钮
1.点开博客园编辑器里的图片上传按钮,弹出”上传本地图片”框。
2.用firebug查看按钮属性,这种上传图片按钮有个很明显的标识,它是一个input标签,并且type属性的值为file。只要 找到这两个标识,我们就可以直接用send_keys()方法上传文件了。
方法二:定位iframe
1.这里定位图片上传按钮情况有点复杂,首先它是在iframe上。
2.这个iframe的id是动态的,且没有name属性,其它属性也不是很明显。
3.通过搜索发现,这个页面上有两个iframe,需要定位的这个iframe是处于第二个位置。
4.可以通过标签定位所有的iframe标签,然后取对应的第几个就可以了。
<例> #coding:utf-8
from selenium import webdriver
import time
profileDir=r'C:\Users\Gloria\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'
profile=webdriver.Firefoxprofile(profiledir)
driver=webdriver.Firefox(profile)
driver.implicitly_wait(30)
driver.get("http://www.cnblogs.com/yoyoketang/")
driver.find_element_by_link_text("新随笔").click()
time.sleep(3)
#点开编辑图片
driver.find_element_by_css_selector("img.mceIcon").click()
time.sleep(3)
#定位所有的iframe,取第二个
iframe=driver.find_elements_by_tag_name('iframe')[1]
#切换到iframe上
driver.switch_to_frame(iframe)
#文件路径
driver.find_element_by_name('file').send_keys
17.获取元素属性;
(1)title的获取方法;
<例> #coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.implicitly_wait(10)
driver.get(“http:www.baidu.com”)
time.sleep(2)
title=driver.title
print title
(2)通过driver.text获取到文本;
<例> #coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.implicitly_wait(10)
driver.get(“http:www.baidu.com”)
time.sleep(2)
title=driver.title
print title
text=driver.find_element_by_id(“setf”).text
print text
(3)获取元素的标签
<例>获取百度输入框的标签属性
tag=driver.find_element_by_id(“kw”).tag_name
print tag
(4)获取元素的其它属性;
获取其它属性方法:get_attribute("属性"),这里的参数可以是class、name等任意属性.
<例>获取百度输入框的class属性;
name=driver.find_element_by_id(“kw”).get_attribute(“class”)
print name
(5)获取输入框内的文本值;
如果在百度输入框输入了内容,这里输入框的内容也是可以获取到的.
<例>获取百度输入框的内容;
driver.find_element_by_id(“kw”).send_keys(“yoyoketang”)
value=drvier.find_element_by_id(“kw”).get_attribute(“value”)
print value
(6)获取浏览器名称;获取浏览器名称很简单,用driver.name就能获取到.
<例>#coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.implicitly_wait(10)
driver.get(“http:www.baidu.com”)
time.sleep(2)
title=driver.title
print title
print driver.name
18.爬页面源码(page_source)
(1)有时候通过元素的属性的查找页面上的某个元素,可能不太好找,这时候可以从selenium的page_source方法可以获取到页 面源码。
<例>#coding:utf-8
from selenium import webdriver
import re
driver=webdriver.Firefox()
driver.get(“http://www.cnblogs.com/yoyoketang/”)
page=driver.page_source
print page
(2)re非贪婪模式:
1.这里需导入re模块(正则表达式模块)
2.用re的正则匹配:非贪婪模式
3.findall方法返回的是一个list集合
4.匹配出来之后发现有一些不是url链接,可以筛选下
#“非贪婪匹配”,re.s('.'匹配字符,包括换行符)”
url_list=re.findall('href=\"(.*?)\"',page,re.s)
for url in url_list:
print url
(3)筛选url地址出来
1.加个if语句判断,‘http’在url里面说明是正常的url地址了
2.把所有的url地址放到一个集合,就是我们想要的结果啦.
#“非贪婪匹配”,re.s('.'匹配字符,包括换行符)”
url_list=re.findall('href=\"(.*?)\"',page,re.s)
url_all=[]
for url in url_list:
if "http" in url:
print url
url_all.append(url)
print url_all
19.cookie相关操作:
(1)获取cookies:get_cookies()
1.获取cookies方法直接用:get_cookies()
2.先启动浏览器,获取cookies,打印出来发现是空:[]
3.打开博客首页后,重新获取cookies,打印出来,就有值了.
<例># coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
#启动浏览器后获取cookies
print driver.get_cookies()
driver.get("http://www.cnblogs.com/yoyoketang/")
#打开主页后获取cookies
print driver.get_cookies()
(2)登录后的cookies:
1.先登录博客园(这里登录用自己的账号和密码吧)
2.重新获取cookies,发现跟之前获取的不一样了
3.主要是找到这一个cookie,发现它的name和value发生了变化,这就是未登录和已登录的区别了(对比上下两张图)
{u'name': u'.CNBlogsCookie', u'value': u'B7813EBA142142CE88CC8C0B33B239F566xxxx'}
<例>
#登录后获取cookies
url="https://passport.cnbblogs.com/user/signin"
driver.get(url)
driver.implicitly_wait(30)
driver.find_element_by_id("input1").send_keys(u"上海—悠悠")
driver.find_element_by_id("input2").send_keys(u"xxxxx")
driver.find_element_by_id("signin").click()
time.sleep(3)
print driver.get_cookies()
(3)获取指定name的cookie:driver.get_cookie(name)
1.获取cookies发现里面有多个cookie,有时候我们只需要其中的一个,把重要的提出来,比如登录的cookie
2.这里用get_cookie(name),指定对应的cookie的name值就行了,比如博客园的:.CNBlogsCookie
<例># 获取指定的name的cookie
print driver.get_cookie(name=".CNBlogsCookie")
(4)清除指定cookie:delete_cookie()
1.为了进一步验证上一步获取到的就是登录的cookie,可以删除它看看页面什么变化
2.删除这个cookie后刷新页面,发现刚才的登录已经失效了,变成未登录状态了
<例># 清除指定name的cookie
driver.delete_cookie(name="CNBlogsCookie")
print driver.get_cookies()
# 为了验证此cookie是登录的,可以删除后刷新页面
driver.refresh()
(5)清除所有cookies:delete_all_cookies()
清除所有cookies后登录状态也失效了,cookies为空[];
<例># 清除所有的cookie
driver.delete_all_cookies()
print driver.get_cookies()
(6)cookie操作的几个方法
1.get_cookies():获取所有cookies
2.driver.get_cookie(name):获取指定name的cookie:
3.清除指定cookie:delete_cookie()
4.delete_all_cookies():清除所有cookies
5.add_cookie(cookie_dict):添加cookie的值
20.绕过验证码(add_cookie);
验证码这种问题是比较头疼的,对于验证码的处理,不要去想破解方法,这个验证码本来就是为了防止别人自动化登录的。如果 你能破解,说明你们公司的验证码吗安全级别不高,那就需要提高级别了。
对于验证码,要么是让开发在测试环境弄个万能的验证码,如:1234,要么就是尽量绕过去,如本篇介绍的添加cookie的方法。
一、fiddler抓包
1.前一篇讲到,登录后会生成一个已登录状态的cookie,那么只需要直接把这个值添加到cookies里面就可以了。
2.可以先手动登录一次,然后抓取这个cookie,这里就需要用抓包工具fiddler了
3.先打开博客园登录界面,手动输入账号和密码(不要点登录按钮)
4.打开fiddler抓包工具,此时再点博客园登录按钮
5.登录成功后,再查看cookie变化,发现多了两组参数,多的这两组参数就是我们想要的,copy出来,一会有用
二.添加cookie方法:driver.add_cookie()
1.add_cookie(cookie_dict)方法里面参数是cookie_dict,说明里面参数是字典类型。
2.源码官方文档介绍:
add_cookie(self, cookie_dict):
Adds a cookie to your current session.
:Args:
- cookie_dict: A dictionary object, with required keys - "name" and "value";
optional keys - "path", "domain", "secure", "expiry"
Usage:
driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True})
3.从官方的文档里面可以看出,添加cookie时候传入字典类型就可以了,等号左边的是name,等号右边的是value。
4.把前面抓到的两组数据(参数不仅仅只有name和value),写成字典类型:
{'name':'.CNBlogsCookie','value':'2C3AE01E461B2D2F1572D02CB936D77A053089AA2xxxx...'}
{'name':'.Cnblogs.AspNetCore.Cookies','value':'CfDJ8Mmb5OBERd5FqtiQlKZZIG4HKz_Zxxx...'}
三、cookie组成结构
1.用抓包工具fidller只能看到cookie的name和value两个参数,实际上cookie还有其它参数。
2.cookie参数组成,以下参数是我通过get_cookie(name)获取到的。
cookie ={u'domain': u'.cnblogs.com',
u'name': u'.CNBlogsCookie',
u'value': u'xxxx',
u'expiry': 1491887887,
u'path': u'/',
u'httpOnly': True,
u'secure': False}
name:cookie的名称
value:cookie对应的值,动态生成的
domain:服务器域名
expiry:Cookie有效终止日期
path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie
httpOnly:防脚本攻击
secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,
浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS。
四、添加cookie
1.这里需要添加两个cookie,一个是.CNBlogsCookie,另外一个是.Cnblogs.AspNetCore.Cookies。
2.我这里打开的网页是博客的主页:http://www.cnblogs.com/yoyoketang,没进入登录页。
3.添加cookie后刷新页面,接下来就是见证奇迹的时刻了。
# coding:utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.cnblogs.com/yoyoketang")
# 添加cookie
c1 = {u'domain': u'.cnblogs.com',
u'name': u'.CNBlogsCookie',
u'value': u'xxxx',
u'expiry': 1491887887,
u'path': u'/',
u'httpOnly': True,
u'secure': False}
c2 = {u'domain': u'.cnblogs.com',
u'name': u'.Cnblogs.AspNetCore.Cookies',
u'value': u'xxxx',
u'expiry': 1491887887,
u'path': u'/',
u'httpOnly': True,
u'secure': False}
driver.add_cookie(c1) # 添加2个值
driver.add_cookie(c2)
time.sleep(3) # 交流QQ群:232607095
# 刷新下页面就见证奇迹了
driver.refresh()
有几点需要注意:
1.登录时候要勾选下次自动登录按钮。
2.add_cookie()只添加name和value,对于博客园的登录是不成功。
3.本方法并不适合所有的网站,一般像博客园这种记住登录状态的才会适合。
21 JS处理滚动条;
selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了。比如下面的场景:
当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的。这时候需要借助滚动条来拖动 屏幕,使被操作的元素显示在当前的屏幕上。滚动条是无法直接用定位工具来定位的。selenium里面也没有直接的方法去控制 滚动条,这时候只能借助J了,还好selenium提供了一个操作js的方法:execute_script(),可以直接执行js的脚本。
一、JavaScript简介
JavaScript是世界上最流行的脚本语言,因为你在电脑、手机、平板上浏览的所有的网页,以及无数基于HTML5的手机App, 交互逻辑都是由JavaScript驱动的。简单地说,JavaScript是一种运行在浏览器中的解释型的编程语言。
(参考链接;http://www.w3school.com.cn/js/index.asp4)
二、控制滚动条高度
1.滚动条回到顶部:
js="var q=document.getElementById('id').scrollTop=0"
driver.execute_script(js)
2.滚动条拉到底部;
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
3.这里可以修改scrollTop 的值,来定位右侧滚动条的位置,0是最上面,10000是最底部。
三、横向滚动条
1.有时候浏览器页面需要左右滚动(一般屏幕最大化后,左右滚动的情况已经很少见了)。
2.通过左边控制横向和纵向滚动条;
scrollTo(x, y)js = "window.scrollTo(100,400);"
driver.execute_script(js)
3.第一个参数x是横向距离,第二个参数y是纵向距离
四、Chrome浏览器
1.以上方法在Firefox上是可以的,但是用Chrome浏览器,发现不管用。
2.Chrome浏览器解决办法:
js = "var q=document.body.scrollTop=0"
driver.execute_script(js)
五、元素聚焦
1.虽然用上面的方法可以解决拖动滚动条的位置问题,但是有时候无法确定我需要操作的元素在什么位置,有可能每次打开 的页面不一样,元素所在的位置也不一样,怎么办呢?
2.这个时候我们可以先让页面直接跳到元素出现的位置,然后就可以操作了。同样需要借助JS去实现。
3.元素聚焦:
target = driver.find_element_by_xxxx()
driver.execute_script("arguments[0].scrollIntoView();", target)
六、获取浏览器名称:driver.name
1.为了解决不同浏览器操作方法不一样的问题,可以写个函数去做兼容。
2.先用driver.name获取浏览器名称,然后用if语句做个判断
# coding:utf-8
from selenium import webdriver
driver=webdriver.Firefox()
driver.get(“https://www.baidu.com”)
print driver.name
七、兼容性
1.兼容谷歌和firefox/IE
#回到顶部
def scroll_top():
if driver.name=="chrome"
js="var q=document.body.scrollTop=0"
else:
js="var q=document.documentElement.scrollTop=0"
return driver.execute_script(js)
#拉到底部
def scroll_foot():
if driver.name=="chrome"
js="var q=document.body.scrollTop=10000"
else:
js="var q=document.documentElement.scrollTop=10000"
return driver.execute_script(js)
八、scrollTo函数
--scrollHeight 获取对象的滚动高度。
--scrollLeft 设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离。
--scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。
--scrollWidth 获取对象的滚动宽度。
scrollTo函数不存在兼容性问题,直接用这个函数就可以了;
#滚动到底部
js = "window.scrollTo(0,document.body.scrollHeight)"
driver.execute_script(js)
#滚动到顶部
js = "window.scrollTo(0,0)"
driver.execute_script(js)
22.JS处理富文本;
一、加载配置
1.打开博客园写随笔,首先需要登录,这里为了避免透露个人账户信息,我直接加载配置文件,免登录了。
不懂如何加载配置文件的,看加载firefox配置.
# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import keys
import time
profileDir=r'C:\xxx...\Firefox\profiles\1x41j9of.default'
profile=webdriver.Firefoxprofile(profileDir)
driver=webdriver.Firefox(profile)
二、打开编辑界面
1.博客首页地址:bolgurl = "http://www.cnblogs.com/"
2.我的博客园地址:yoyobolg = bolgurl + "yoyoketang"
3.点击“新随笔”按钮,id=blog_nav_newpost
bolgurl= "http://www.cnblogs.com/"
yoyobolg = bolgurl + "yoyoketang"
driver.get(yoyobolg)
driver.find_element_by_id("blog_nav_newpost").click()
三、定位iframe
1.打开编辑界面后先不要急着输入内容,先sleep几秒钟
2.输入标题,这里直接通过id就可以定位到,没什么难点
3.接下来就是重点要讲的富文本的编辑,这里编辑框有个iframe,所以需要先切换
四、js输入中文
1.这里定位编辑正文是定位上图的红色框框位置body部分,也就是id=tinymce
2.定位到之后,用js的方法直接输入,无需切换iframe
3.直接点保存按钮,无需再切回来.
<完整代码>
# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# profileDir路径对应直接电脑的配置路径
profileDir = r'C:\xxx\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'
profile = webdriver.FirefoxProfile(profileDir)
driver = webdriver.Firefox(profile)
bolgurl = "http://www.cnblogs.com/"
yoyobolg = bolgurl + "yoyoketang"
driver.get(yoyobolg)
driver.find_element_by_id("blog_nav_newpost").click()
time.sleep(5)
edittile = u"Selenium2+python自动化23-富文本"
editbody = u"这里是发帖的正文"
driver.find_element_by_id("Editor_Edit_txbTitle").send_keys(edittile)
body = "这里是通过js发的正文内容"
# js处理iframe问题(js代码太长了,我分成两行了)
js = 'document.getElementById("Editor_Edit_EditorBody_ifr")' \
'.contentWindow.document.body.innerHTML="%s"' % body
driver.execute_script(js)
# 保存草稿
driver.find_element_by_id("Editor_Edit_lkbDraft").click()
23 js处理日历控件(修改readonly属性);
<完整代码>
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://kyfw.12306.cn/otn/index/init")
# 去掉元素的readonly属性
js = 'document.getElementById("train_date").removeAttribute("readonly");'
driver.execute_script(js)
# 用js方法输入日期
js_value = 'document.getElementById("train_date").value="2016-12-25"'
driver.execute_script(js_value)
# # 清空文本后输入值
# driver.find_element_by_id("train_date").clear()
# driver.find_element_by_id("train_date").send_keys("2016-12-25")
24.js处理内嵌div滚动条;
一.纵向滚动;
1.这个是div的属性:
2.这里最简单的通过id来定位,通过控制 scrollTop的值来控制滚动条高度
3.运行下面代码,观察页面是不是先滚动到底部,过五秒再回到顶部。(get里面地址 是浏览器打开该页面的地址)
<例># coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get("file:///C:/Users/Gloria/Desktop/div.html")
# 纵向底部
js1=‘document.getElementById("yoyoketang").scrollTop=10000’
driver.execute_script(js1)
time.sleep(5)
# 纵向顶部
js1=‘document.getElementById("yoyoketang").scrollTop=0’
driver.execute_script(js1)
二.横向滚动;
先通过id来定位,通过控制scrollLeft的值来控制滚动条高度.
<例># coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get("file:///C:/Users/Gloria/Desktop/div.html")
# 横向右侧
js3=‘document.getElementById("yoyoketang").scrollLeft=10000’
driver.execute_script(js3)
time.sleep(5)
# 横向左侧侧
js4=‘document.getElementById("yoyoketang").scrollLeft=0’
driver.execute_script(js4)
三.用class属性定位;
js用class属性定位,返回的是一个list对象,这里取第一个就可以了。
注意;element和elements是不一样的.
<例> # coding:utf-8
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get("file:///C:/Users/Gloria/Desktop/div.html")
# 获取的class返回的是list对象,取list的第一个
js5=‘document.getElementsByClassName("scroll") [0].scrollTop=10000’
driver.execute_script(js5)
time.sleep(5)
# 控制横向滚动条位置
js6=‘document.getElementsByClassName("scroll") [0].scrollLeft=10000’
driver.execute_script(js6)
有时候很多元素属性都一样时候,就可以用复数定位,取对应的第几个就可以了。
25 js处理多窗口;
js去掉target="_blank"属性
1.第一步为了先登录,我这里加载配置文件免登录了.
2.这里用到js的定位方法,定位该元素的class属性
3.定位到该元素后直接修改target属性值为空.
<例># coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# 加载配置文件免登录
profileDir = r'C:\Users\Gloria\AppData\Roaming\Mozilla\Firefox \Profiles\1x41j9of.default'
profile = webdriver.FirefoxProfile(profileDir)
driver = webdriver.Firefox(profile)
driver.get("https://www.baidu.com/")
# 修改元素的target属性
js = 'document.getElementsByClassName("mnav")[0].target="";'
driver.execute_script(js)
driver.find_element_by_link_text("糯米").click()
(注意:并不是所有的链接都适用于本方法,本篇只适用于有这个target="_blank" 属性链接情况。)
26 js解决click失效问题:
<例># coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select
import time
driver = webdriver.Firefox()
url = "https://www.baidu.com"
driver.get(url)
time.sleep(3)
mouse = driver.find_element("link text", "设置")
ActionChains(driver).move_to_element(mouse).perform()
time.sleep(3)
driver.find_element("link text", "搜索设置").click()
time.sleep(3)
s = driver.find_element("id", "nr")
Select(s).select_by_visible_text("每页显示50条")
# 方法一:先点父元素 交流QQ群:232607095
# driver.find_element("id", "gxszButton").click()
# driver.find_element("class name", "prefpanelgo").click()
# 方法二:用js直接去点击 .
js = 'document.getElementsByClassName("prefpanelgo")[0].click();'
driver.execute_script(js)
27.18种定位方法总结:
一、十八种定位方法:
(1)常用的八种元素定位方式:
1.id定位:find_element_by_id(self, id_)
2.name定位:find_element_by_name(self, name)
3.class定位:find_element_by_class_name(self, name)
4.tag定位:find_element_by_tag_name(self, name)
5.link定位:find_element_by_link_text(self, link_text)
6.partial_link定位find_element_by_partial_link_text(self, link_text)
7.xpath定位:find_element_by_xpath(self, xpath)
8.css定位:find_element_by_css_selector(self, css_selector)
(2)这八种是复数形式;
9.id复数定位find_elements_by_id(self, id_)
10.name复数定位find_elements_by_name(self, name)
11.class复数定位find_elements_by_class_name(self, name)
12.tag复数定位find_elements_by_tag_name(self, name)
13.link复数定位find_elements_by_link_text(self, text)
14.partial_link复数定位find_elements_by_partial_link_text(self, link_text)
15.xpath复数定位find_elements_by_xpath(self, xpath)
16.css复数定位find_elements_by_css_selector(self, css_selector)
(3)这两种就是快失传了的;
17.find_element(self, by='id', value=None)
18.find_elements(self, by='id', value=None)
二、element和elements傻傻分不清
1.element方法定位到是是单数,是直接定位到元素
2.elements方法是复数,这个学过英文的都知道,定位到的是一组元素,返回的是 list队列.
3.可以用type()函数查看数据类型.
<参考代码>
# coding:utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 这里是定位的单个id
element = driver.find_element_by_id("kw")
print type(element)
print element
# 这里定位是多个class
elements = driver.find_elements_by_class_name("mnav")
print type(elements)
print elements
# 这里用的css语法
s = driver.find_elements("css selector", ".mnav")
# '地图'在第四个位置
print s[3].text
s[3].click()
# 这个写法也是可以的
# driver.find_elements("css selector", ".mnav")[3].click()
28.查看webdriver API(带翻译)
一、pydoc
1.到底什么是pydoc? ,这个是准确的解释:Documentation generator and online help system. pydoc是Python自带的模块,主要用于从python模块中自动生成文 档,这些文档可以基于文本呈现的、也可以生成WEB页面的,还可以在服务器上以 浏览器的方式呈现!简而言之,就是帮你从代码和注释自动生成文档的工具。
2.举个栗子,我需要查看python里面open函数的功能和语法,打开cmd,输入:python -m pydoc open
3.-m参数:python以脚本方法运行模块;
>>python -m pydoc open
二、启动server;
1.打开cmd命令行,输入:python -m pydoc -p 6666
2.-p参数:这个表示在本机上启动服务
3.6666参数:这个是服务端口号,随意设置
打开后,界面会出现一个地址:http://localhost:6666/,在浏览器直接打开。
三、浏览器查看文档
1.在浏览器输入:http://localhost:6666/
2.Built-in Moudles :这个是python自带的模块.
四、webdriver API:
1.找到这个路径:python2.7\lib\site-packages,点开selenium
2.打开的selenium>webdriver>firefox>webdriver,最终路径: http://localhost:6666/selenium.webdriver.firefox.webdriver.html
3.最终看到的这些就是selenium的webdriver API帮助文档啦.
29.练习题;
一.去掉页面动态窗.
1、alert弹窗;
这种弹窗是最简单的一种,Selenium里有自带的方法来处理它,用switch_to.alert 先定位到弹窗,然后使用一系列方法来操作:
accept - 点击【确认】按钮
dismiss - 点击【取消】按钮(如有按钮)
send_keys - 输入内容(如有输入框)
这里举一个菜鸟教程上的一个例子:
http://www.runoob.com/try/try.php?filename=tryjs_alert,
在页面左边点击【显示警告框】就会弹出一个alert弹窗:
我们用以下代码就能实现切换至弹窗并点击【确定】按钮的效果:
al = driver.switch_to_alert() al.accept()
这里这个switch_to_alert()其实是旧写法,照理应该是用switch_to.alert(),但是 新写法却会报错,目前猜测是版本问题,可能不支持新写法,这里就先用旧写法。
<例># encoding:utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.runoob.com/try/try.php?filename=tryjs_alert") driver.switch_to.frame("iframeResult")
driver.find_element_by_xpath("html/body/input").click()
time.sleep(1) al = driver.switch_to_alert()
time.sleep(1) al.accept()
2、自定义弹窗
由于alert弹窗不美观,现在大多数网站都会使用自定义弹窗,使用Selenium自带的 方法就驾驭不了了,此时就要搬出JS大法。这里举一个新世界教育官网首页的例子 (http://sh.xsjedu.org):
<例># encoding:utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://sh.xsjedu.org/")
time.sleep(1)
js='document.getElementById ("doyoo_monitor").style.display="none";'
driver.execute_script(js)
二.定位百度-更多产品;
<例># coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Firefox()
url = "https://www.baidu.com"
driver.get(url)
driver.maximize_window()
time.sleep(2)
e = driver.find_element_by_link_text("更多产品")
ActionChains(driver).move_to_element(e).perform()
time.sleep(1)
# ele = driver.find_element_by_name("tj_more")
# 经确认,是可以定位到元素的
# print ele.text
# 这一步点击失效了
# ele.click()
# js大法好,完美解决ckick失效问题
js = "document.getElementsByName('tj_more')[0].click()"
driver.execute_script(js)
三.获取百度联系词;
(1)定位输入框联想词
1.首先在百度输入框输入关键词,如:博客,然后输入框下方会自动匹配出关键词。
2.这时候可以用firebug工具定位到联想出来的词,可以看到下方匹配出来的词都有共同的class属性,这时候就可以全部定 位到了。
(2)打印全部匹配出来的词,可以通过get_attribute()方法获取到文本信息
(3)点击其中一个
1.点击其中的一个联想词,如:第二个
2.这里可以先加一个判断,如果获取到了就点击,没获取到就不点击了,以免抛异常。
(如果想依次点击,用for循环就可以了)
<例>
# coding:utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
time.sleep(1)
driver.find_element_by_id("kw").send_keys(u"博客")
# 获取百度输入框的
time.sleep(1)
bd = driver.find_elements_by_class_name("bdsug-overflow")
for i in bd:
print i.get_attribute("data-key")
# 点击其中的一个,如:第二个
if len(bd) > 1:
bd[1].click()
# 打印当前页面url
print driver.current_url
else:
print "未获取到匹配的词"
30.js几种定位方法总结;
一、以下总结了5种js定位的方法
除了id是定位到的是单个element元素对象,其它的都是elements返回的是list对象.
1.通过id获取
document.getElementById(“id”)
2.通过name获取
document.getElementsByName(“Name”)
返回的是list
3.通过标签名选取元素
document.getElementsByTagName(“tag”)
4.通过CLASS类选取元素
document.getElementsByClassName(“class”)
兼容性:IE8及其以下版本的浏览器未实现getElementsByClassName方法
5.通过CSS选择器选取元素
document.querySelectorAll(“css selector")
兼容性:IE8及其以下版本的浏览器只支持CSS2标准的选择器语法
二、id定位
1.定位博客首页的管理按钮:id="blog_nav_contact"
2.js的定位语法里面id定位获取的是单个元素对象,可以直接用click()方法点击元素.
三、class定位
1.js里面class定位获取到是是一个list列表对象.
2.操作元素的话通过下标取对应的第几个值,如果只用一个那就取下标[0].
3.定位到输入框,可以直接用value="xxx"方法输入内容.
4.ByName和ByTagName跟上面class一样,都是定位的一组元素.
四、CSS选择器
1.css选择器定位到的也是一组元素,语法跟前面学到的css语法是一样的.
<例>
# coding: utf-8
from selenium import Webdriver
import time
driver = webdriver.Firefox()
driver.get("http://cnblogs.com/yoyoketang")
#定位首页管理按钮:id=blog_nav_contact
js1 = 'document.getElementById("blog_nav_contact")'.click;'
driver.execute_script(js1)
#输入账号
js2 = 'document.getElementsByClassName("input-text")[0].value="悠悠";'
driver.execute_script(js2)
#输入密码
js3 = 'document.getElementsByClassName("input-text")[1].value="xxx";'
driver.execute_script(js3)
#勾选记住密码
js4 = 'document.getElementsByName("remember_me")[0].click();'
driver.execute_script(js4)
#点击登录按钮
js5 = 'document.querySelectorAll(#signin)[0].click();'
driver.execute_script(js5)
31.定位的坑:class属性有空格.
有些class属性中间有空格,如果直接复制过来定位是会报错的InvalidSelectorException: Message:
The given selector u-label f-dn is either invalid or does not result in a WebElement. The following error occurred:
InvalidSelectorError: Compound class names not permitted.这个报错意思是说定位语法错了。
一、定位带空格的class属性
1.以126邮箱为例:http://mail.126.com/,定位账号输入框.
2.如果直接复制过来用class属性定位是会报错的.
二、class属性科普
1.class属性中间的空格并不是空字符串,那是间隔符号,表示的是一个元素有多个class的属性名称,在整个HTML文档 ,使用CSS中的同一个class类可能是一个或多个!
(class属性是比较特殊的一个,除了这个有多个属性外,其它的像name,id是没多个属性的)
2.想补习html基础知识的可以参考菜鸟教程:http://www.runoob.com/html/html-attributes.html
三、class定位
既然知道class属性有空格是多个属性了,那定位的时候取其中的一个就行(并且要唯一),也就是说class="j- inputtext dlemail",取j-inputtext 和dlemail都是可以的,这样这个class属性在页面上唯一就行.
那么问题来了:如何才知道这个元素的某个属性是不是在页面上是唯一的呢?
四、判断元素唯一性
F12切换到HTML界面,在搜索框输入关键字搜索,如:j-inputtext,然后按回车搜索,看页面上有几个class属性中有 j-inputtext这个属性的,就知道是不是唯一的了。
五、class属性不唯一怎么办
如果这个class的多个属性都不是唯一的咋办呢,元素不唯一也不用怕,可以用复数定位,把所有的相同元素定位出来 ,按下标取第几个就行。
六、css定位
1.css来定位class属性的元素前面加个点(.)就行,然后空格变成点(.)就能定位了.
2.当然css也可以取class属性的其中一个属性(页面上唯一的)来定位,定位方法是灵活多变的.
<参考代码>
# coding:utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://mail.126.com/")
driver.implicitly_wait(20)
driver.switch_to.frame("x-URS-iframe")
# 方法一:取单个class属性
driver.find_element_by_class_name("dlemail").send_keys("yoyo")
driver.find_element_by_class_name("dlpwd").send_keys("12333")
# 方法二:定位一组取下标定位(乃下策)
# driver.find_elements_by_class_name("j-inputtext")[0].send_keys("yoyo")
# driver.find_elements_by_class_name("j-inputtext")[1].send_keys("12333")
# 方法三:css定位
# driver.find_element_by_css_selector(".j-inputtext.dlemail").send_keys("yoyo")
# driver.find_element_by_css_selector(".j-inputtext.dlpwd").send_keys("123")
# 方法四:取单个class属性也是可以的
# driver.find_element_by_css_selector(".dlemail").send_keys("yoyo")
# driver.find_element_by_css_selector(".dlpwd").send_keys("123")
32.jquery定位(简直逆天)
一、jquery搜索元素;
1.按F12进控制台
2.点全部按钮
3.右侧如果没出现输入框,就点下小箭头按钮
4.输入框输入jquery定位语法,如:$("#input1")
5.点运行按钮
6.左边会出现定位到的元素,如果有多个会以list列表的形式展示出。
二、jquery定位语法;
1.jquery语法可以学下w3school的教程:http://www.w3school.com.cn/jquery/jquery_syntax.asp
2.格式如下:
$(selector).action()
--selector:这里的定位语法和css的定位语法是一致的,如:id就是#,class就是点(.),tag标签名前面就无符号
--action:这个是定位元素之后的操作行为事件,如click.
三、jquery行为;
1.发送文本语法:$(selector).val(输入文本的值)
2.清空文本语法:$(selector).val('') # 空字符串,两个单引号
3.点击按钮:$(selector).click()
<参考代码>
# coding:utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("https://passport.cnblogs.com/user/signin")
driver.implicitly_wait(20)
# 输入账号
username = "$('#input1').val('上海-悠悠')"
driver.execute_script(username)
# 清空文本
# time.sleep(5)
# clear = "$('#input1').val('')"
# driver.execute_script(clear)
# 输入密码
psw = "$('#input2').val('yoyo')"
driver.execute_script(psw)
# 点击登录按钮
button = "$('#signin').click()"
driver.execute_script(button)
你可能感兴趣的:(WEB自动化详解)
Vue2 与 Vue3 中 Computed 计算属性详解
阿贾克斯的黎明
前端 vue.js 前端 javascript
目录Vue2与Vue3中Computed计算属性详解一、Vue2中的Computed计算属性1.简单写法2.get和set写法二、Vue3中的Computed计算属性1.简单写法2.get和set写法三、总结在Vue开发中,计算属性(computed)是一个非常重要的特性,它可以对数据进行二次计算,为我们的开发带来了很大的便利。本文将结合Vue2和Vue3的特点,深入探讨computed计算属性,
pytest.fixture详解:如何有效管理测试的前置条件与后置条件
测试不打烊
接口自动化 pytest
pytest.fixture是pytest的一个重要特性,用于创建和管理测试的前置条件(setup)和后置条件(teardown)。它允许你为测试提供一些预先准备好的资源或数据,而不需要在每个测试函数中重复这些逻辑。基础概念pytest.fixture是一个装饰器,标记一个函数作为“夹具”(fixture),这个夹具会在每次测试函数运行前被调用,并可以在测试函数中作为参数使用。测试函数中的夹具会自
iotop 命令详解:深入分析系统 I/O 性能
测试不打烊
性能测试 linux 运维 压力测试
iotop是Linux系统中一个非常有用的命令行工具,类似于top命令,但它专门用于监控进程的磁盘I/O活动。它通过显示每个进程的I/O操作,可以帮助我们定位并分析那些占用过多磁盘资源的进程。本文将详细介绍iotop命令的使用方法、典型输出示例、各项指标的详细解析,并结合异常指标详细分析系统I/O性能问题的解决过程。一、iotop命令使用方法详解iotop命令的主要功能是显示每个进程的I/O读写速
Python学习教程:必须掌握的Cookie知识点都在这里了
weixin_30387339
python 爬虫 javascript ViewUI
今天我们来全面了解一下Cookie(小饼干)相关的知识!篇幅有点长,在学习Python的伙伴或者有兴趣的你,可以耐心看哦!相信很多同学肯定听过Cookie这个东西,也大概了解其作用,但是其原理以及如何设置,可能没有做过web的同学并不是非常清楚,以前的Python学习教程中其实有跟大家提到过,那今天就带大家详细了解下Cookie相关的知识!一、诞生背景爬虫系列教程的第一篇:HTTP详解中我们便说过
Shiro 框架详解
大家都说我身材好
Java高级 spring java shiro
Shiro是一款轻量级的Java安全框架,提供了身份认证、授权、加密和会话管理等功能。它可以集成到任何JavaWeb应用程序中,并且易于使用和扩展。Shiro的设计理念是简洁而灵活,不仅可以应用于Web应用程序,还可以应用于命令行、移动设备和分布式系统等各种应用场景。1.Shiro的概述Shiro是一个开源的Java安全框架,由Apache开发和维护。Shiro可以帮助开发人员快速实现安全特性,包
Python随机森林算法详解与案例实现
闲人编程
python 算法 python 随机森林 数据分析 人工智能
目录Python随机森林算法详解与案例实现1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1数据集介绍4.2代码实现4.3代码解释4.4运行结果5、回归案例:使用随机森林预测波士顿房价5.1数据集介绍5.2代码实现5.3代码解释5.4运行结果6、随机森林的优缺点7、改进方向8、应用场景9、总结Python随机森林算法详解与案例实现1、随机森林算法概述随
Python 循环神经网络(RNN)算法详解与应用案例
闲人编程
python python rnn 算法 循环神经网络 深度学习 文本生成
目录Python循环神经网络(RNN)算法详解与应用案例引言一、RNN的基本原理1.1RNN的结构1.2RNN的优势与挑战二、Python中RNN的面向对象实现2.1`RNNCell`类的实现2.2`RNNModel`类的实现2.3`Trainer`类的实现三、案例分析3.1序列预测3.1.1数据准备3.1.2模型训练3.1.3结果分析3.2文本生成3.2.1数据准备3.2.2模型训练3.2.3文
Python中的Session和Cookie详解
闲人编程
进阶算法案例 python 开发语言 cookie session 网络 爬虫
目录Python中的Session和Cookie详解引言一、Cookie1.1Cookie的基本概念1.2Cookie的工作原理1.3Cookie的基本属性1.4Python中Cookie的实现1.4.1Cookie实现代码1.5使用案例二、Session2.1Session的基本概念2.2Session的工作原理2.3Session的优点2.4Python中Session的实现2.4.1Sess
python画二维矩阵图_基于python 二维数组及画图的实例详解
weixin_39785400
python画二维矩阵图
1、二维数组取值注:不管是二维数组,还是一维数组,数组里的数据类型要一模一样,即若是数值型,全为数值型#二维数组importnumpyasnplist1=[[1.73,1.68,1.71,1.89,1.78],[54.4,59.2,63.6,88.4,68.7]]list3=[1.73,1.68,1.71,1.89,1.78]list4=[54.4,59.2,63.6,88.4,68.7]list
Linux Docker 部署 Elasticsearch (ES) 集群详解教程
努力的小T
Linux 云计算运维基础 docker linux docker elasticsearch 运维 服务器 云计算 大数据
1.安装Docker首先,确保你的Linux系统上已经安装了Docker。如果尚未安装,可以通过以下命令进行安装:sudoyuminstall-yyum-utilssudoyum-config-manager--add-repohttps://download.docker.com/linux/centos/docker-ce.reposudoyuminstalldocker-cedocker-c
电脑ip如何手动切换?多种方法详解
hgdlip
ip 电脑 tcp/ip 网络协议 网络 电脑
在数字化时代,IP地址作为网络设备的唯一标识,扮演着至关重要的角色。无论是出于隐私保护、访问特定资源,还是出现网络冲突等,掌握如何手动切换电脑的IP地址都显得尤为重要。本文将详细介绍多种切换电脑IP地址的方法,希望对您有所帮助。一、了解IP地址在深入探讨如何切换IP之前,我们首先需要了解IP地址的基本概念。IP地址(InternetProtocolAddress)是分配给网络上每个设备的唯一数字标
时间序列分析之AR、MA、ARMA、ARIMA详解(5)
白马负金羁
机器学习之术 协整 cointegration ARIMA 时间序列分析
在时间序列分析中最常使用的一系列模型:AR、MR、ARMA,一直到ARIMA,都源于乔治·博克斯和格威利姆·詹金斯等人的一系列工作(他们的有关成果后汇集成该领域的权威经典著作【1】)。乔治·博克斯被认为是二十世纪的一代统计学大师,他有一句广为人知的名言:所有的模型都是错误的,但有一些是有用的(“Allmodelsarewrong,butsomeareuseful”)。为了让统计模型发挥作用,深入理
【GD32】从0开始学GD32单片机(5)—— USART串口通信详解
马浩同学
GD32系列 单片机 嵌入式硬件 网络
目录概述功能概述全双工异步通信模式参数说明串口发送串口接收例程串口通信概述USART串口将是我们接触的第一个通信协议,也是最常用的通信协议。在项目开发中,我们常常用串口来打印单片机的运行日志,在查找一些运行时异常时特别有用,如果能通过串口日志打印来找出运行时的异常,肯定就不需要再debug了,省去了很多时间。下面是GD32串口的结构框图,咋一看非常复杂,但其实日常我们只使用了其中一小部分。功能概述
深入解析 Vert.x 的关键特性、架构及其在异步编程中的应用
不是二师兄的八戒
架构 Vert.x
下面将对Vert.x进行更深入的解读,从其底层架构、事件驱动模型、线程模型、集群模式、以及与现代微服务体系的深度集成等方面来进行拓展,以便全面理解Vert.x作为一个异步非阻塞框架的优势和复杂性。1.Vert.x底层架构详解1.1多反应器架构(Multi-ReactorPattern)Vert.x的核心是基于多反应器模式(Multi-ReactorPattern),这使得它可以有效地处理大量的并发
Java的垃圾回收机制详解——从入门到出土,学不会接着来砍我!
我心向阳iu
# JVM Java面试知识点精讲 java jvm 算法
文章目录哪些内存需要回收回收堆:垃圾的定义引用计数算法:可达性分析算法:GCRoots的对象回收方法区:垃圾的定义如何回收垃圾垃圾回收算法总结标记—清除算法(适用老年代,但是基本废弃了)标记—复制算法(现在新生代普遍用的)标记—整理算法(现在老年代普遍用的)JVMGC的种类GC的触发机制年轻代GC(MinorGC)触发机制老年代GC(MajorGC/FullGC)触发机制FullGC触发机制为什么
go-Context包详解
Zerore
go golang 开发语言 后端
在go语言中,上下文context.Context用来设置截止日期、同步信号、传递请求相关值得结构体。上下文与Goroutine得关系比较密切,是go语言中独特得设计,在其他编程语言中很少见到类似的概念。context.Context是一个接口,定义了如下四个方法://AContextcarriesadeadline,acancellationsignal,andothervaluesacross
Python常见面试题的详解4
ylfhpy
Python基础 python 开发语言 面试
1.单例模式的实现方式要点:Python有多种实现单例模式的方法。模块由于其特性天然支持单例,首次导入生成对象,后续导入直接复用。通过装饰器可以控制实例的创建,元类能借助__call__方法管理实例化过程,重写类的__new__方法也能保证实例的唯一性。示例:pythondefsingleton(cls):instances={}defget_instance(*args,**kwargs):#如
AMBA-CHI协议详解(十一)
数字硬鉴
AMBA-CHI协议 AMBA协议 CHI协议 总线设计 ARM架构 CPU设计
AMBA-CHI协议详解(一)-IntroductionAMBA-CHI协议详解(二)-Channelfields/ReadtransactionsAMBA-CHI协议详解(三)-WritetransactionsAMBA-CHI协议详解(四)-OthertransactionsAMBA-CHI协议详解(五)-TransactionidentifierfieldsAMBA-CHI协议详解(六)-T
AMBA-CHI协议详解(八)
数字硬鉴
AMBA-CHI协议 AMBA协议 CHI协议 CPU总线设计 CPU设计 总线设计
AMBA-CHI协议详解(一)-IntroductionAMBA-CHI协议详解(二)-Channelfields/ReadtransactionsAMBA-CHI协议详解(三)-WritetransactionsAMBA-CHI协议详解(四)-OthertransactionsAMBA-CHI协议详解(五)-TransactionidentifierfieldsAMBA-CHI协议详解(六)-T
AMBA-CHI协议详解(九)
数字硬鉴
AMBA-CHI协议 AMBA协议 CHI协议 CPU总线设计 CPU设计 总线设计
AMBA-CHI协议详解(一)-IntroductionAMBA-CHI协议详解(二)-Channelfields/ReadtransactionsAMBA-CHI协议详解(三)-WritetransactionsAMBA-CHI协议详解(四)-OthertransactionsAMBA-CHI协议详解(五)-TransactionidentifierfieldsAMBA-CHI协议详解(六)-T
AMBA-CHI协议详解(四)
数字硬鉴
AMBA-CHI协议 AMBA协议 CHI协议 CPU总线设计
《AMBA5CHIArchitectureSpecification》AMBA-CHI协议详解(一)-IntroductionAMBA-CHI协议详解(二)-Channelfields/ReadtransactionsAMBA-CHI协议详解(三)-WritetransactionsAMBA-CHI协议详解(四)-OthertransactionsAMBA-CHI协议详解(五)-Transacti
Node.js 中的 fs 模块详解
小灰灰学编程
Node.js node.js 前端
fs(FileSystem)模块是Node.js的核心模块之一,用于处理文件系统的操作,包括文件的读取、写入、删除、重命名等。它提供了同步和异步两种操作方式,适用于不同的场景。1.前置知识1.1文件系统文件系统是操作系统用于管理文件和目录的一种机制。Node.js通过fs模块提供了对文件系统的访问能力。1.2同步与异步同步操作:阻塞代码执行,直到操作完成。异步操作:非阻塞,通过回调函数、Promi
【Python】使用国内镜像加速 pip 安装详解
Peter-Lu
# 人工智能之python基础 python pip
文章目录一、pip工具简介1.什么是pip?2.什么是`-i`参数?二、国内镜像源的选择三、如何使用国内镜像源1.临时指定国内镜像源2.批量安装依赖时使用镜像源3.全局配置国内镜像源配置方法:四、国内镜像的使用场景1.安装大型库时2.批量安装依赖五、注意事项1.镜像源的选择2.镜像源的可信性3.镜像源与pip缓存在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库
网页性能优化详解
我的狗的狗
性能优化 前端
网页性能优化详解引言网页性能优化是提升用户体验和网站整体质量的关键环节。随着用户对网页加载速度和响应时间的要求越来越高,性能优化变得尤为重要。本文将详细介绍网页性能优化的概念、方法和具体示例,帮助开发者更好地理解和实施性能优化策略。什么是网页性能优化?网页性能优化是指通过各种技术和策略,减少网页加载时间、提高响应速度,从而提升用户体验的过程。性能优化的目标包括但不限于:减少页面加载时间:用户希望网
Python的垃圾回收机制,详解Python的GC体系
李云龙炮击平安线程
python 系统架构 面试 跳槽 后端 架构
什么是垃圾回收?为什么需要垃圾回收?垃圾回收即Garbagecollection简称为GC,是Python,Java等高级语言所使用的内存回收机制,由虚拟机帮助我们管理内存,让它自动把我们去追踪和回收内存中的对象。没有作用的对象就是垃圾,虚拟机就是扫地机器人,在某个时机自动帮我们清除垃圾。区别于C和C++这种让用户自己进行内存管理的方式,由虚拟机代用户管理内存。让用户自己进行内存管理的方式固然自由
转:javascript获取上一访问页面
dianai7709
javascript 移动开发 ViewUI
原文链接:移动端返回上一页,刚需!document.referrer详解全文如下:返回上一页,在PC端我们可以使用:history.go(-1)或者history.back(),可以正常返回第一层。这样,我们不需要上一页的url具体是什么,只要使用history一般都没啥问题。但是在移动端,如果想要返回上一页。比如从A页面跳到B页面,如果B页面想返回A页面,为了防止不会跳错,必须要有一个返回那如果
Java API文档使用指南与详解
Kay Lam
本文还有配套的精品资源,点击获取简介:JavaAPI文档是Java开发者的权威参考资料,详细描述了Java标准库中的所有公开组件,涵盖了I/O、网络编程、多线程、集合框架、数据库连接(JDBC)、XML处理、图形用户界面(GUI)等多个领域。文档提供清晰的指南帮助理解并使用Java的功能,包含每个类或接口的详细注释、使用示例和常见用途。此外,还介绍了JDK6版本的中文离线文档CHM文件及其下载方式
C语言结构体,枚举,联合,位断等自定义类型详解
myloveasuka
C语言 c语言 数据结构 开发语言
目录结构体1.结构体声明2.结构体成员的访问3.结构体自引用4.结构体变量定义,初始化,传参5.结构体内存对齐位段1.什么是位段?2.位段的内存分配枚举1.枚举类型的定义2.枚举的使用3.枚举的优点联合(共同体)1.联合类型的定义2.联合的特点3.面试题:判断当前计算机的大小端存储4.联合大小的计算代码仓库结构体1.结构体声明1.1概念1.结构体是一些值的集合,这些值称为成员变量。2.结构体的每个
JavaScript系列(68)--运行时优化技术详解
ᅟᅠ 一进制
JavaScript javascript java 前端
JavaScript运行时优化技术详解今天,让我们深入探讨JavaScript的运行时优化技术。运行时优化是提升JavaScript应用性能的另一个关键环节,它关注代码在实际执行过程中的性能表现。运行时优化基础概念小知识:JavaScript运行时优化是指在代码执行过程中,通过各种技术手段来提高代码的执行效率。这包括即时编译(JIT)、内联缓存、类型特化等技术。基本优化实现//1.函数执行优化器c
C++ 多态与 C# 的公有继承详解
雪域Code
c++ c# 开发语言 C#
多态是面向对象编程中的一个重要概念,它能够实现在父类引用指向子类对象时的动态绑定,从而在运行时确定调用哪个子类对象的方法。C++和C#是两种流行的面向对象编程语言,在多态性和继承方面有一些共同之处,但也存在一些差异。本文将详细讨论C++中的多态和C#中的公有继承,并附带相应的源代码示例。首先,让我们来看一下C++中的多态性。在C++中,实现多态性通常需要通过虚函数和基类指针或引用来实现。虚函数是在
解线性方程组
qiuwanchi
package gaodai.matrix;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Sc
在mysql内部存储代码
annan211
性能 mysql 存储过程 触发器
在mysql内部存储代码
在mysql内部存储代码,既有优点也有缺点,而且有人倡导有人反对。
先看优点:
1 她在服务器内部执行,离数据最近,另外在服务器上执行还可以节省带宽和网络延迟。
2 这是一种代码重用。可以方便的统一业务规则,保证某些行为的一致性,所以也可以提供一定的安全性。
3 可以简化代码的维护和版本更新。
4 可以帮助提升安全,比如提供更细
Android使用Asynchronous Http Client完成登录保存cookie的问题
hotsunshine
android
Asynchronous Http Client是android中非常好的异步请求工具
除了异步之外还有很多封装比如json的处理,cookie的处理
引用
Persistent Cookie Storage with PersistentCookieStore
This library also includes a PersistentCookieStore whi
java面试题
Array_06
java 面试
java面试题
第一,谈谈final, finally, finalize的区别。
final-修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能
网站加速
oloz
网站加速
前序:本人菜鸟,此文研究总结来源于互联网上的资料,大牛请勿喷!本人虚心学习,多指教.
1、减小网页体积的大小,尽量采用div+css模式,尽量避免复杂的页面结构,能简约就简约。
2、采用Gzip对网页进行压缩;
GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNⅨ系统的文件压缩。我们在Linux中经常会用到后缀为.gz
正确书写单例模式
随意而生
java 设计模式 单例
单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧。但是其中的坑却不少,所以也常作为面试题来考。本文主要对几种单例写法的整理,并分析其优缺点。很多都是一些老生常谈的问题,但如果你不知道如何创建一个线程安全的单例,不知道什么是双检锁,那这篇文章可能会帮助到你。
懒汉式,线程不安全
当被问到要实现一个单例模式时,很多人的第一反应是写出如下的代码,包括教科书上也是这样
单例模式
香水浓
java
懒汉 调用getInstance方法时实例化
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if(null == ins
安装Apache问题:系统找不到指定的文件 No installed service named "Apache2"
AdyZhang
apache http server
安装Apache问题:系统找不到指定的文件 No installed service named "Apache2"
每次到这一步都很小心防它的端口冲突问题,结果,特意留出来的80端口就是不能用,烦。
解决方法确保几处:
1、停止IIS启动
2、把端口80改成其它 (譬如90,800,,,什么数字都好)
3、防火墙(关掉试试)
在运行处输入 cmd 回车,转到apa
如何在android 文件选择器中选择多个图片或者视频?
aijuans
android
我的android app有这样的需求,在进行照片和视频上传的时候,需要一次性的从照片/视频库选择多条进行上传
但是android原生态的sdk中,只能一个一个的进行选择和上传。
我想知道是否有其他的android上传库可以解决这个问题,提供一个多选的功能,可以使checkbox之类的,一次选择多个 处理方法
官方的图片选择器(但是不支持所有版本的androi,只支持API Level
mysql中查询生日提醒的日期相关的sql
baalwolf
mysql
SELECT sysid,user_name,birthday,listid,userhead_50,CONCAT(YEAR(CURDATE()),DATE_FORMAT(birthday,'-%m-%d')),CURDATE(), dayofyear( CONCAT(YEAR(CURDATE()),DATE_FORMAT(birthday,'-%m-%d')))-dayofyear(
MongoDB索引文件破坏后导致查询错误的问题
BigBird2012
mongodb
问题描述:
MongoDB在非正常情况下关闭时,可能会导致索引文件破坏,造成数据在更新时没有反映到索引上。
解决方案:
使用脚本,重建MongoDB所有表的索引。
var names = db.getCollectionNames();
for( var i in names ){
var name = names[i];
print(name);
Javascript Promise
bijian1013
JavaScript Promise
Parse JavaScript SDK现在提供了支持大多数异步方法的兼容jquery的Promises模式,那么这意味着什么呢,读完下文你就了解了。
一.认识Promises
“Promises”代表着在javascript程序里下一个伟大的范式,但是理解他们为什么如此伟大不是件简
[Zookeeper学习笔记九]Zookeeper源代码分析之Zookeeper构造过程
bit1129
zookeeper
Zookeeper重载了几个构造函数,其中构造者可以提供参数最多,可定制性最多的构造函数是
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolea
【Java命令三】jstack
bit1129
jstack
jstack是用于获得当前运行的Java程序所有的线程的运行情况(thread dump),不同于jmap用于获得memory dump
[hadoop@hadoop sbin]$ jstack
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F
jboss 5.1启停脚本 动静分离部署
ronin47
以前启动jboss,往各种xml配置文件,现只要运行一句脚本即可。start nohup sh /**/run.sh -c servicename -b ip -g clustername -u broatcast jboss.messaging.ServerPeerID=int -Djboss.service.binding.set=p
UI之如何打磨设计能力?
brotherlamp
UI ui教程 ui自学 ui资料 ui视频
在越来越拥挤的初创企业世界里,视觉设计的重要性往往可以与杀手级用户体验比肩。在许多情况下,尤其对于 Web 初创企业而言,这两者都是不可或缺的。前不久我们在《右脑革命:别学编程了,学艺术吧》中也曾发出过重视设计的呼吁。如何才能提高初创企业的设计能力呢?以下是 9 位创始人的体会。
1.找到自己的方式
如果你是设计师,要想提高技能可以去设计博客和展示好设计的网站如D-lists或
三色旗算法
bylijinnan
java 算法
import java.util.Arrays;
/**
问题:
假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,
您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳
子上进行这个动作,而且一次只能调换两个旗子。
网上的解法大多类似:
在一条绳子上移动,在程式中也就意味只能使用一个阵列,而不使用其它的阵列来
警告:No configuration found for the specified action: \'s
chiangfai
configuration
1.index.jsp页面form标签未指定namespace属性。
<!--index.jsp代码-->
<%@taglib prefix="s" uri="/struts-tags"%>
...
<s:form action="submit" method="post"&g
redis -- hash_max_zipmap_entries设置过大有问题
chenchao051
redis hash
使用redis时为了使用hash追求更高的内存使用率,我们一般都用hash结构,并且有时候会把hash_max_zipmap_entries这个值设置的很大,很多资料也推荐设置到1000,默认设置为了512,但是这里有个坑
#define ZIPMAP_BIGLEN 254
#define ZIPMAP_END 255
/* Return th
select into outfile access deny问题
daizj
mysql txt 导出数据到文件
本文转自:http://hatemysql.com/2010/06/29/select-into-outfile-access-deny%E9%97%AE%E9%A2%98/
为应用建立了rnd的帐号,专门为他们查询线上数据库用的,当然,只有他们上了生产网络以后才能连上数据库,安全方面我们还是很注意的,呵呵。
授权的语句如下:
grant select on armory.* to rn
phpexcel导出excel表简单入门示例
dcj3sjt126com
PHP Excel phpexcel
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
if (PHP_SAPI == 'cli')
die('This example should only be run from a Web Brows
美国电影超短200句
dcj3sjt126com
电影
1. I see. 我明白了。2. I quit! 我不干了!3. Let go! 放手!4. Me too. 我也是。5. My god! 天哪!6. No way! 不行!7. Come on. 来吧(赶快)8. Hold on. 等一等。9. I agree。 我同意。10. Not bad. 还不错。11. Not yet. 还没。12. See you. 再见。13. Shut up!
Java访问远程服务
dyy_gusi
httpclient webservice get post
随着webService的崛起,我们开始中会越来越多的使用到访问远程webService服务。当然对于不同的webService框架一般都有自己的client包供使用,但是如果使用webService框架自己的client包,那么必然需要在自己的代码中引入它的包,如果同时调运了多个不同框架的webService,那么就需要同时引入多个不同的clien
Maven的settings.xml配置
geeksun
settings.xml
settings.xml是Maven的配置文件,下面解释一下其中的配置含义:
settings.xml存在于两个地方:
1.安装的地方:$M2_HOME/conf/settings.xml
2.用户的目录:${user.home}/.m2/settings.xml
前者又被叫做全局配置,后者被称为用户配置。如果两者都存在,它们的内容将被合并,并且用户范围的settings.xml优先。
ubuntu的init与系统服务设置
hongtoushizi
ubuntu
转载自:
http://iysm.net/?p=178 init
Init是位于/sbin/init的一个程序,它是在linux下,在系统启动过程中,初始化所有的设备驱动程序和数据结构等之后,由内核启动的一个用户级程序,并由此init程序进而完成系统的启动过程。
ubuntu与传统的linux略有不同,使用upstart完成系统的启动,但表面上仍维持init程序的形式。
运行
跟我学Nginx+Lua开发目录贴
jinnianshilongnian
nginx lua
使用Nginx+Lua开发近一年的时间,学习和实践了一些Nginx+Lua开发的架构,为了让更多人使用Nginx+Lua架构开发,利用春节期间总结了一份基本的学习教程,希望对大家有用。也欢迎谈探讨学习一些经验。
目录
第一章 安装Nginx+Lua开发环境
第二章 Nginx+Lua开发入门
第三章 Redis/SSDB+Twemproxy安装与使用
第四章 L
php位运算符注意事项
home198979
位运算 PHP &
$a = $b = $c = 0;
$a & $b = 1;
$b | $c = 1
问a,b,c最终为多少?
当看到这题时,我犯了一个低级错误,误 以为位运算符会改变变量的值。所以得出结果是1 1 0
但是位运算符是不会改变变量的值的,例如:
$a=1;$b=2;
$a&$b;
这样a,b的值不会有任何改变
Linux shell数组建立和使用技巧
pda158
linux
1.数组定义 [chengmo@centos5 ~]$ a=(1 2 3 4 5) [chengmo@centos5 ~]$ echo $a 1 一对括号表示是数组,数组元素用“空格”符号分割开。
2.数组读取与赋值 得到长度: [chengmo@centos5 ~]$ echo ${#a[@]} 5 用${#数组名[@或
hotspot源码(JDK7)
ol_beta
java HotSpot jvm
源码结构图,方便理解:
├─agent Serviceab
Oracle基本事务和ForAll执行批量DML练习
vipbooks
oracle sql
基本事务的使用:
从账户一的余额中转100到账户二的余额中去,如果账户二不存在或账户一中的余额不足100则整笔交易回滚
select * from account;
-- 创建一张账户表
create table account(
-- 账户ID
id number(3) not null,
-- 账户名称
nam