python selenium 采坑
系統(tǒng)環(huán)境:
python2
mac os 10.14.5
正文:
之前裝了一個(gè)firefox就可以完美使用selenium了,但是在firefox上進(jìn)行網(wǎng)頁(yè)檢查時(shí)不是很習(xí)慣。所以還是想使用chrome,但是由于selenium原生不支chrome,所以需要下載chrome driver并在生成selenium對(duì)象前把 chrome driver和chrome放到應(yīng)用程序路徑下,或者再初始化webdriver.Chrome對(duì)象時(shí)設(shè)置chrome driver和chrome的路徑。
options
=
webdriver
.
ChromeOptions
(
)
options
.
binary_location
=
\
"/Applications/Google Chrome .app/Contents/MacOS/Google Chrome"
browser
=
webdriver
.
Chrome
(
DRIVER_BIN
,
chrome_options
=
options
)
初始化好browser后,剩下的所有操作都和這個(gè)browser對(duì)象有關(guān)了。
基本操作流程是:
-
第一步,通過(guò)browser對(duì)象的find_element*方法來(lái)查找到頁(yè)面中的element,常用的有如下方法:
find_element_by_xpath()
find_element_by_id()
find_element_by_name() - 這些find方法返回的都是一個(gè)或者一組element對(duì)象,接下來(lái)就是調(diào)用這些element對(duì)象的方法來(lái)實(shí)現(xiàn)賦值,和點(diǎn)擊等操作。常見(jiàn)的使用方法有click,send_keys等。
- 有時(shí)點(diǎn)擊某個(gè)按鈕或者鏈接會(huì)新開(kāi)一個(gè)頁(yè)面,這時(shí)就需要使用browser的switch_to方法和window_handles屬性了,如下面便是跳轉(zhuǎn)到第二個(gè)頁(yè)面:
browser
.
switch_to
.
window
(
browser
.
window_handles
[
1
]
)
下面的代碼邏輯是登錄一個(gè)網(wǎng)站后,點(diǎn)擊button然后跳轉(zhuǎn)到新頁(yè)然后完成兩個(gè)表單的填寫和提交。
#!/bin/python
from
selenium
import
webdriver
from
selenium
.
webdriver
.
common
.
keys
import
Keys
from
selenium
.
webdriver
.
support
.
ui
import
Select
import
os
import
time
PROJECT_ROOT
=
os
.
path
.
abspath
(
os
.
path
.
dirname
(
__file__
)
)
DRIVER_BIN
=
os
.
path
.
join
(
PROJECT_ROOT
,
'bin/chromedriver'
)
# browser = webdriver.Chrome(executable_path=DRIVER_BIN)
# initialize
options
=
webdriver
.
ChromeOptions
(
)
options
.
binary_location
=
\
"/Applications/Google Chrome .app/Contents/MacOS/Google Chrome"
browser
=
webdriver
.
Chrome
(
DRIVER_BIN
,
chrome_options
=
options
)
browser
.
get
(
'https://172.16.50.253'
)
def
element_send_keys
(
browser
,
element
,
keys
)
:
try
:
element
=
browser
.
find_element_by_id
(
element
)
except
Exception
:
try
:
element
=
browser
.
find_element_by_xpath
(
element
)
except
Exception
:
element
=
browser
.
find_element_by_name
(
element
)
element
.
send_keys
(
keys
)
def
button_click
(
browser
,
element
,
action
)
:
allowed_actions
=
[
'click'
,
'touch'
]
if
action
not
in
allowed_actions
:
raise
Exception
try
:
element
=
browser
.
find_element_by_id
(
element
)
except
Exception
:
element
=
browser
.
find_element_by_xpath
(
element
)
method
=
getattr
(
element
,
action
)
method
(
)
# login
def
login
(
browser
,
name
,
passwd
)
:
user_name
=
browser
.
find_element_by_id
(
'id_username'
)
user_passwd
=
browser
.
find_element_by_id
(
'id_password'
)
login_button
=
browser
.
find_element_by_id
(
'loginBtn'
)
user_name
.
send_keys
(
name
)
user_passwd
.
send_keys
(
passwd
)
login_button
.
click
(
)
# create project
def
create_project
(
browser
,
project_name
,
project_description
)
:
# click Administrator
admin_entry
=
'//*[@id="navbar-collapse"]/ul[3]/a'
admin_button
=
browser
.
find_element_by_xpath
(
admin_entry
)
admin_button
.
click
(
)
browser
.
switch_to
.
window
(
browser
.
window_handles
[
1
]
)
# click Account Centor
account_entry
=
'//*[@id="dashboard-slug-identity"]'
account_button
=
browser
.
find_element_by_xpath
(
account_entry
)
account_button
.
click
(
)
# click project
project_entry
=
'//*[@id="sidebar-accordion-identity"]/li[1]/a'
project_button
=
browser
.
find_element_by_xpath
(
project_entry
)
project_button
.
click
(
)
time
.
sleep
(
4
)
# click create project
create_project_entry
=
'//*[@id="content_body"]/div[1]/div/div/div[2]/hz-resource-panel/div/ng-transclude/hz-resource-table/hz-dynamic-table/hz-magic-search-context/div/div[1]/div/actions/action-list[1]/button'
button_click
(
browser
,
create_project_entry
,
'click'
)
# fill the project form
element_send_keys
(
browser
,
'name'
,
project_name
)
element_send_keys
(
browser
,
'description'
,
project_description
)
sure_xpath
=
'/html/body/div[1]/div/div/div[3]/button[2]/translate/span'
button_click
(
browser
,
sure_xpath
,
'click'
)
# create user
def
create_user
(
browser
,
name
,
phone
,
passwd
,
rpasswd
,
project
,
realName
,
email
,
cardNumber
,
organize
)
:
# click Administrator
admin_entry
=
'//*[@id="navbar-collapse"]/ul[3]/a'
button_click
(
browser
,
admin_entry
,
'click'
)
browser
.
switch_to
.
window
(
browser
.
window_handles
[
1
]
)
# click Account Centor
account_entry
=
'//*[@id="dashboard-slug-identity"]'
button_click
(
browser
,
account_entry
,
'click'
)
time
.
sleep
(
2
)
# click user
user_entry
=
'//*[@id="sidebar-accordion-identity"]/li[2]/a'
button_click
(
browser
,
user_entry
,
'click'
)
time
.
sleep
(
4
)
# click create project
create_user_entry
=
'//*[@id="content_body"]/div[1]/div/div/div[2]/hz-resource-panel/div/ng-transclude/hz-resource-table/hz-dynamic-table/hz-magic-search-context/div/div[1]/div/actions/action-list[1]/button'
button_click
(
browser
,
create_user_entry
,
'click'
)
browser
.
switch_to
.
window
(
browser
.
window_handles
[
1
]
)
element_send_keys
(
browser
,
'name'
,
name
)
element_send_keys
(
browser
,
'phone'
,
phone
)
passwd_entry
=
'//*[@id="password"]/div/input'
element_send_keys
(
browser
,
passwd_entry
,
passwd
)
rpasswd_entry
=
'//*[@id="confirmPassword"]/div/input'
element_send_keys
(
browser
,
rpasswd_entry
,
rpasswd
)
time
.
sleep
(
3
)
project_btn
=
Select
(
browser
.
find_element_by_name
(
'project'
)
)
project_btn
.
select_by_visible_text
(
'hello_gxj'
)
element_send_keys
(
browser
,
'realName'
,
realName
)
element_send_keys
(
browser
,
'email'
,
email
)
element_send_keys
(
browser
,
'cardNumber'
,
cardNumber
)
element_send_keys
(
browser
,
'organize'
,
organize
)
submit_entry
=
'/html/body/div[1]/div/div/div[3]/button[2]'
button_click
(
browser
,
submit_entry
,
'click'
)
# create prepaid resource
login
(
browser
,
'admin'
,
'cloud'
)
create_project
(
browser
,
'hello_gxj'
,
'gxj_test'
)
create_user
(
browser
,
'albert_guan'
,
'188162081211'
,
'cloudSH'
,
'cloudSH'
,
'albert'
,
'albert'
,
'albert@cloud.com'
,
'111'
,
'1111'
)
time
.
sleep
(
300
)
browser
.
close
(
)
browser
.
find
總結(jié):
雖然selenium提供了非常強(qiáng)大的python api能夠幫助我們輕松地去控制瀏覽器,實(shí)現(xiàn)網(wǎng)頁(yè)操作的自動(dòng)化,但是對(duì)于編碼不是很好以及經(jīng)常變化網(wǎng)頁(yè)html結(jié)構(gòu)的網(wǎng)頁(yè)而言,selenium也會(huì)喪失其操作上的便利性和可控性。對(duì)此而言就是巨大的業(yè)務(wù)開(kāi)發(fā)量和修改頻率。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
