Skip to content

Commit 45b39ca

Browse files
committed
add selenium
1 parent 7b9afd9 commit 45b39ca

12 files changed

+218
-5
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ python的强大之处有很大的一方面在于它有各种各样非常强大
166166

167167
## contextlib
168168

169+
## [selenium](content/selenium.md)
170+
169171
## [Other_thing](content/other_thing.md)
170172

171173
## [Reference_link](content/reference_link.md)

code/geckodriver.log

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
1480565888958 geckodriver INFO Listening on 127.0.0.1:1649
2+
1480565890927 mozprofile::profile INFO Using profile path C:\Users\dell\AppData\Local\Temp\rust_mozprofile.cX5rSkFByfly
3+
1480565890942 geckodriver::marionette INFO Starting browser D:\Program Files (x86)\Mozilla Firefox\firefox.exe
4+
1480565891028 geckodriver::marionette INFO Connecting to Marionette on localhost:1655
5+
JavaScript error: resource://gre/components/SanityTest.js, line 287: NS_ERROR_FILE_ACCESS_DENIED: Component returned failure code: 0x801480565894270 addons.productaddons WARN Failed downloading via XHR, status: 0, reason: error
6+
NFO Listening on port 1655
7+
1480565895587 Marionette INFO startBrowser ce85d289-89a2-4122-be00-38becb24b1ef
8+
[Child 21768] WARNING: pipe error: 109: file c:/builds/moz2_slave/m-rel-w32-00000000000000000000/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 346
9+
93df-15e93e59b147
10+
1480559845437 Marionette INFO sendAsync bde2128d-fcb4-4777-93df-15e93e59b147
11+
1480559845523 Marionette INFO sendAsync bde2128d-fcb4-4777-93df-15e93e59b147
12+
1480559845750 Marionette INFO sendAsync bde2128d-fcb4-4777-93df-15e93e59b147
13+
1480559962688 addons.productaddons WARN Failed downloading via XHR, status: 0, reason: error

code/selenium_demo.py

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# coding=utf-8
2+
3+
from selenium import webdriver
4+
from selenium.webdriver.common.keys import Keys
5+
6+
driver = webdriver.Firefox()
7+
driver.get("http://www.python.org")
8+
assert "Python" in driver.title
9+
elem = driver.find_element_by_name("q")
10+
elem.clear()
11+
elem.send_keys("pycon")
12+
elem.send_keys(Keys.RETURN)
13+
print driver.page_source.encode("utf-8")
14+
assert "No results found." not in driver.page_source
15+
driver.close()

code/selenium_improve.py

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# coding=utf-8
2+
3+
from selenium import webdriver
4+
from selenium.webdriver.common.action_chains import ActionChains #引入ActionChains鼠标操作类
5+
from selenium.webdriver.common.keys import Keys #引入keys类操作
6+
import time
7+
8+
def s(int):
9+
time.sleep(int)
10+
browser = webdriver.Chrome()
11+
browser.get('http://www.baidu.com')
12+
print u'现在将浏览器最大化'
13+
browser.maximize_window()
14+
text = browser.find_element_by_id('jgwab').text
15+
print text #打印备案信息
16+
17+
browser.find_element_by_id('kw').send_keys(u'杨彦星')
18+
print browser.find_element_by_id('kw').get_attribute('type')
19+
print browser.find_element_by_id('kw').size #打印输入框的大小
20+
browser.find_element_by_id('su').click()
21+
time.sleep(3)
22+
23+
print u'现在我将设置浏览器为宽480,高800显示'
24+
browser.set_window_size(480,800)
25+
browser.get('http://m.mail.10086.cn')
26+
time.sleep(3)
27+
28+
print u'现在我将回到刚才的页面 -- 搜索结果'
29+
browser.maximize_window()
30+
browser.back()
31+
time.sleep(3)
32+
33+
print u'现在我将回到之前的页面 -- 百度首页'
34+
browser.forward()
35+
time.sleep(5)
36+
print u'现在我将打开杨彦星的网站进行json搜索'
37+
browser.get('http://www.yangyanxing.com')
38+
browser.find_element_by_xpath(".//*[@id='ls']").send_keys(u'json')
39+
browser.find_element_by_xpath(".//*[@id='header']/div[1]/div/form/input[2]").click()
40+
time.sleep(5)
41+
browser.quit()
42+
43+
browser = webdriver.Chrome()
44+
45+
print u'以下将以登录人人网来进行上面的综合应用'
46+
browser.get('http://www.renren.com/SysHome.do')
47+
browser.find_element_by_id('email').clear()#这个是以id选择元素
48+
browser.find_element_by_id('email').send_keys('email')
49+
browser.find_element_by_id('email').send_keys(Keys.BACK_SPACE)
50+
time.sleep(2)
51+
browser.find_element_by_id('email').send_keys('m')
52+
s(2)
53+
browser.find_element_by_id('email').send_keys(Keys.CONTROL,'a')
54+
s(2)
55+
browser.find_element_by_id('email').send_keys(Keys.CONTROL,'x')#剪切掉里面的内容
56+
s(2)
57+
browser.find_element_by_id('email').send_keys(Keys.CONTROL,'v') #重新输入进去
58+
s(2)
59+
browser.find_element_by_name('password').clear()#这个是以name选择元素
60+
browser.find_element_by_name('password').send_keys('password')
61+
#browser.find_element_by_xpath(".//*[@id='login']").click()#这个是以xpath选择元素
62+
browser.find_element_by_xpath(".//*[@id='login']").send_keys(Keys.ENTER) #这里通过点击Enter键来登录
63+
browser.maximize_window()
64+
article = browser.find_element_by_link_text(u'周碧华:社科院出现内鬼意味着什么?')
65+
ActionChains(browser).move_to_element(article).perform()#将鼠标移动到这里,但是这里不好用
66+
ActionChains(browser).context_click(article).perform()
67+
time.sleep(5)
68+
69+
browser.quit()

code/socket_proxy.py

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# coding=utf-8
2+
3+
import time
4+
import socket
5+
import urllib
6+
7+
host = '127.0.0.1'
8+
port = 8080
9+
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
10+
server.bind((host,port))
11+
print "server is running ... "
12+
13+
while 1:
14+
server.listen(5)
15+
ss,addr = server.accept()
16+
url = "http://127.0.0.1:5002/"
17+
request = ss.recv(1024).split(" ")[1]
18+
page = urllib.urlopen(url+request).read()
19+
print time.strftime('%Y-%m-%d %H:%M:%S')," [%s:%s] %s"%(addr[0],addr[1],request)
20+
ss.sendall(page)
21+
ss.close()

code/time_demo.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
#coding=utf-8
1+
# coding=utf-8
2+
23
import time
34
import calendar
45

content/commands.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
##commands
1+
## commands
22

33
这是一个专门用来执行shell的函数库,类似与os库的popen,它只有三个函数,非常简洁。
44

content/selenium.md

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
## selenium
2+
3+
selenium 是一个自动化的测试工具,用来模拟浏览器操作。
4+
5+
使用 pip 安装好 selenium 之后,可以看到它可以模拟很多目前主流的浏览器操作,像 Firefox ,Chrome 等。
6+
7+
```
8+
webdriver.Android
9+
webdriver.Blackberry
10+
webdriver.Chrome
11+
webdriver.Common
12+
webdriver.Edge
13+
webdriver.Firefox
14+
webdriver.Ie
15+
webdriver.Opera
16+
webdriver.Phantomjs
17+
webdriver.Remote
18+
webdriver.Safari
19+
webdriver.Support
20+
```
21+
22+
在使用 selenium 测试我们的应用之前,我们需要先安装几个浏览器驱动程序,比如说 Firefox 的 geckodriver,和 chrome 的 chromedriver,这样就能够调用这些浏览器来完成对程序的自动化测试。
23+
24+
下载地址:geckodriver 的[官方下载](https://github.com/mozilla/geckodriver/releases),或者在[本站下载](../others/geckodriver-v0.11.1-win64.zip),chromedriver 的[官方下载](https://sites.google.com/a/chromium.org/chromedriver/downloads),或者在[本站下载](../others/chromedriver_win32.zip)
25+
26+
下载完成之后可以将驱动程序所在位置加入环境变量 PATH 中,或者在每次使用时指明驱动软件的位置,同时,对于 Firefox 和 Chrome 来说,如果想要调用也需指明其二进制文件的位置,或者将二进制文件所在位置加入环境变量。
27+
28+
```
29+
from selenium import webdriver
30+
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
31+
32+
binary = FirefoxBinary(r'F:\FirefoxPortable\Firefox.exe')
33+
driver = webdriver.Firefox(executable_path=r'C:\Chrome\geckodriver', firefox_binary=binary)
34+
35+
```
36+
37+
### 简单应用
38+
39+
我们来模拟一个浏览器的简单操作。
40+
41+
```
42+
# coding=utf-8
43+
44+
from selenium import webdriver
45+
from selenium.webdriver.common.keys import Keys
46+
47+
driver = webdriver.Firefox()
48+
driver.get("http://www.python.org")
49+
assert "Python" in driver.title
50+
elem = driver.find_element_by_name("q")
51+
elem.clear()
52+
elem.send_keys("pycon")
53+
elem.send_keys(Keys.RETURN)
54+
print driver.page_source
55+
assert "No results found." not in driver.page_source
56+
driver.close()
57+
58+
```
59+
60+
### 复杂应用
61+
62+
```
63+
```

content/socket.md

+31
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,35 @@ while True:
535535
conn.close()
536536
```
537537

538+
#### Socket HTTP 转发
539+
540+
将 8080 端口转发到 80 端口
541+
542+
```
543+
# coding=utf-8
544+
545+
import time
546+
import socket
547+
import urllib
548+
549+
host = '127.0.0.1'
550+
port = 8080
551+
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
552+
server.bind((host,port))
553+
print "server is running ... "
554+
555+
while 1:
556+
server.listen(5)
557+
conn,addr = server.accept()
558+
url = "http://127.0.0.1:5002/"
559+
request = conn.recv(1024).split(" ")[1]
560+
page = urllib.urlopen(url+request).read()
561+
print time.strftime('%Y-%m-%d %H:%M:%S')," [%s:%s] %s"%(addr[0],addr[1],request)
562+
conn.sendall(page)
563+
conn.close()
564+
565+
```
566+
538567
## socket 常见错误标志
539568

540569
[Errno 9] Bad file descriptor
@@ -551,5 +580,7 @@ while True:
551580

552581
[Errno 111] 拒绝连接
553582

583+
[Errno 10053] 服务器端断开一个已经建立的连接
584+
554585
[Errno 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)
555586

content/time.md

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
##time
2-
3-
1+
## time
42

53
时间函数time,使用起来也非常简单,一般用来取得当前时间,和计算一段时间差。
64

others/chromedriver_win32.zip

3.36 MB
Binary file not shown.

others/geckodriver-v0.11.1-win64.zip

2.37 MB
Binary file not shown.

0 commit comments

Comments
 (0)