1. 程式人生 > >顯性等待的另一種寫法

顯性等待的另一種寫法

logs ole 我們 技術 AS python代碼 HERE led char

在看蟲師的selenium--webdriver(python)教程時,發現另一種顯性等待的寫法,這也是WebDriverWait類源碼中給出的例子

WebDriverWait(driver, 30, 1).until_not(lambda x: x.find_element_by_id("someId").is_displayed())

我們來看看蟲師的例子

一. html源碼

在python代碼的同級目錄下保存一個level_locate.html文件

<!DOCTYPE html>
<html>
<head>
<meta 
http-equiv="content-type" content="text/html;charset=utf-8" /> <title>Level Locate</title> <script type="text/javascript" src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> <link href="http://libs.baidu.com/bootstrap/2.3.2/css/bootstrap.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://libs.baidu.com/bootstrap/2.3.2/js/bootstrap.js"></script> </html>

現在要求鼠標懸浮在Link1下拉框中的Action

技術分享圖片

二. python實現的兩種方法

1. 顯性等待的第一種寫法

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time
import os

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

#窗口最大化
driver.maximize_window()

#點擊Link1鏈接(彈出下拉列表)
driver.find_element_by_link_text("Link1").click()

#id為dropdown1的下拉框的元素表達式
dropdown1_id = "dropdown1"

#設置顯性等待,等待id為dropdown1的下拉框出現
WebDriverWait(driver, 10, 0.3).until(EC.visibility_of_element_located((By.ID, dropdown1_id)))

#定位到Action
action_element = driver.find_element_by_xpath("//ul[@id=‘dropdown1‘]//a[text()=‘Action‘]")

#鼠標定位到子元素上
ActionChains(driver).move_to_element(action_element).perform()
time.sleep(2)

driver.quit()

2. 顯性等待的第二種寫法

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

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

#窗口最大化
driver.maximize_window()

#點擊Link1鏈接(彈出下拉列表)
driver.find_element_by_link_text("Link1").click()

#找到id為dropdown1的父元素
WebDriverWait(driver, 10, 0.3).until(lambda the_driver: the_driver.find_element_by_id("dropdown1").is_displayed())

#在父元素下找到link為Action的子元素
menu = driver.find_element_by_id("dropdown1").find_element_by_link_text("Action")

#鼠標定位到子元素上
webdriver.ActionChains(driver).move_to_element(menu).perform()
time.sleep(2)

driver.quit()

和方法一不同的地方,我都用橙色表示出來了,需要註意的是 is_displayed() 表示該元素是否用戶可見

參考文章

https://www.cnblogs.com/fnng/p/3193955.html

顯性等待的另一種寫法