python實例編寫(2)--等待,一組對象,層級元素,frame對象處理

一.設置等待javascript

#coding=utf-8

from selenium import webdriver
from selenium.webdriver.support.ui  import WebDriverWait
from time import sleep

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

#添加智能等待
driver.implicitly_wait(3)
driver.find_element_by_id("su").click()

#添加固定等待
sleep(3)
driver.find_element_by_link_text("登陸").click()

#使用WebDriverWait方法,和until(method,message)以及 until_not(method,message),lambda提供一個運行時建立動態函數的方法
element=WebDriverWait(driver,5).until(lambda x:x.find_element_id("TANGRAM__PSP_2__closeBtn"))
element.click()

二. 多選框,組對象css

新建文件checkbox.htmlhtml

<html  lang="zh-cn">
    <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
        <title>Checkbox</title>
        <script type="text/javascript" async="" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" />
        <script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
    </head>
    <body>
        <h3>checkbox</h3>
        <div class="well">
            <form class="form-horizontal">
                <div class="control-group">
                    <label class="control-label" for="c1">checkbox1</label>
                    <div class="controls">
                        <input type="checkbox" id="c1" />
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="c2">checkbox2</label>
                    <div class="controls">
                        <input type="checkbox" id="c2" />
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="c3">checkbox3</label>
                    <div class="controls">
                        <input type="checkbox" id="c3" />
                    </div>
                </div>                     
                <div class="control-group">
                    <label class="control-label" for="r">radio</label>
                    <div class="controls">
                        <input type="radio" id="r" />
                    </div>
                </div>                     
            </form>
        </div>
    </body>
</html>

  建立elements.pyjava

# -*- coding: cp936 -*-
# coding =utf-8
from selenium import webdriver
import os

 #path.abspath()獲取當前路徑下的文件,因此html文件必須和本文件地址一致

driver=webdriver.Chrome()
file_path='file:///'+os.path.abspath("checkbox.html")
driver.get(file_path)

#選擇頁面標籤元素爲 input的 #len爲顯示長度,pop刪除指定位置的元素,默認爲最後一個,由0開始
inputs=driver.find_elements_by_tag_name('input')
for input in inputs:
    if input.get_attribute('type')=='checkbox':
        input.click()
print len(driver.find_elements_by_css_selector('input[type=checkbox]'))
print driver.find_elements_by_css_selector('input[type=checkbox]').pop(0).click()

#或者能夠直接定位複選框 inputs=driver.find_elements_by_css_selector('input[type=checkbox]') #報錯內容:TypeError: 'WebElement' object is not iterable,用elements 而不是 element #對於以:結尾的,次行須要縮進 

三.層級定位,子元素屬性相同的,先定位父元素,再定位子元素,二級定位python

建立locate.htmljquery

<html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8"  />
        <title>Level Locate</title>        
        <script type="text/javascript" async="" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet"  />        
    </head>
    <body>
        <h3>Level locate</h3>
        <div class="span3">        
            <div class="well">
                <div class="dropdown">
                    <a class="dropdown-toggle" data-toggle="dropdown" href="#">Link1</a>
                    <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel" id="dropdown1" >
                        <li><a tabindex="-1" href="#">Action</a></li>
                        <li><a tabindex="-1" href="#">Another action</a></li>
                        <li><a tabindex="-1" href="#">Something else here</a></li>
                        <li class="divider"></li>
                        <li><a tabindex="-1" href="#">Separated link</a></li>
                    </ul>
                </div>                
            </div>            
        </div>
        <div class="span3">        
            <div class="well">
                <div class="dropdown">
                    <a class="dropdown-toggle" data-toggle="dropdown" href="#">Link2</a>
                    <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel" >
                        <li><a tabindex="-1" href="#">Action</a></li>
                        <li><a tabindex="-1" href="#">Another action</a></li>
                        <li><a tabindex="-1" href="#">Something else here</a></li>
                        <li class="divider"></li>
                        <li><a tabindex="-1" href="#">Separated link</a></li>
                    </ul>
                </div>                
            </div>            
        </div>
    </body>
    <script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</html>

  

思路:找到第一個下拉框,肯定ul,定位子菜單web

腳本編寫以下:ajax

#coding=utf-8

from  selenium import webdriver
from  time import sleep
from  selenium.webdriver.support.ui  import WebDriverWait
from  selenium.webdriver.common.action_chains import ActionChains
import os


dr=webdriver.Chrome()
file_path='file:///'+os.path.abspath('secondlocate.html')
dr.get(file_path)

#點擊link1連接(直接用click,使之彈出子菜單)
dr.find_element_link_text('link1').click()

#查找父元素的子元素,先定位下拉菜單,再定位選項,二級定位!!!
submenu=dr.find_element_by_id('dropdown1').find_element_by_link_text('Another action')

#鼠標移動到子元素上並點擊,ActionChains(dr)生成用戶實例,存儲鼠標對象,move_to_element用於鼠標移動到元素上,perform用於執行存儲元素的行爲
ActionChains(dr).move_to_element(submenu).perform()

sleep(3)
dr.quit()

                              


       

 四.html中嵌套html,即iframe,常見有UE編輯器(使用dr.swicth_to_frame(frame的id))bootstrap

frame.html (f1)鑲嵌  inner.html(f2)api

frame.html

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"  />
<title>frame</title>
<script type="text/javascript" async=""
src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
"></script>
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet"  />
<script type="text/javascript">
$(document).ready(function(){
});
</script>
</head>
<body>
<div class="row-fluid">
<div class="span10 well">
<h3>frame</h3>
<iframe id="f1" src="inner.html" width="800",
height="600"></iframe>
</div>
</div>
</body>
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</html>

  inner.html

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"  />
<title>inner</title>
</head>
<body>
<div class="row-fluid">
<div class="span6 well">
<h3>inner</h3>
<iframe id="f2" src="http://www.baidu.com" width="700"
height="500"></iframe>
<a href="javascript:alert('watir-webdriver better than
selenium webdriver;')">click</a>
</div>
</div>
</body>
</html>

  效果圖以下:

frame.py

#encoding=utf-8
from selenium import webdriver
from time import sleep
import os

dr=webdriver.Chrome()
file_path='file:///'+os.path.abspath('frame.html')
dr.get(file_path)

#找到頁面,等待,frame中,f1嵌套f2,f2裏面顯示的是百度首頁,用dr.switch_to_frame()便可
dr.implicitly_wait(30)
#先找到f1,再找到f2
dr.switch_to_frame("f1")
dr.switch_to_frame("f2")

#定位元素便可
dr.find_element_by_id("kw").send_keys("haha")
dr.find_element_by_id("su").click()

dr.quit()
相關文章
相關標籤/搜索