在上一篇文章中,我们讲到了显示等待,在until的方法中使用的等待条件是:title_is。下面简单介绍了selenium的17种等待:
序号 | 方法名 | 含义 | 返回值 |
---|---|---|---|
1 | title_is | 判断title,是否出现 | 布尔 |
2 | title_contains | 判断title,是否包含某些字符 | 布尔 |
3 | presence_of_element_located | 判断某个元素是否被加到了dom树里,并不代表该元素一定可见 | WebElement |
4 | visibility_of _element_located | 判断某个元素是否被加到了dom树里并且可见,宽和高都大于0 | WebElement |
5 | visibility_of | 判断元素是否可见,如果可见就返回这个元素 | WebElement |
6 | presence_of_all_elements_located | 判断是否至少有一个元素存在于dom树中 | 列表 |
7 | visibility_of_any_elements_located | 判断是否至少有一个元素在页面上可见 | 列表 |
8 | text_to_be_present_in_element | 判断指定的元素中是否包含了预期的字符串 | 布尔 |
9 | text_to_be_present_in_element_value | 判断指定的元素属性值中是否包含了预期的字符串 | 布尔 |
10 | frame_to_be_available_and_switch_to_it | 判断该iframe是否可以switch进去 | 布尔 |
11 | invisibility_of_elements_located | 判断某个元素是否存在于dom或不可见 | 布尔 |
12 | element_to_be_clickable | 判断某个元素中是否可见且是enable的,代表可点击 | 布尔 |
13 | staleness_of | 等待某个元素从dom树中移除 | 布尔 |
14 | element_to_bo_selected | 判断某个元素是否被选中了 | 布尔 |
15 | element_selection_state_to_be | 判断某个元素的选中状态是否符合预期 | 布尔 |
16 | element_located_selection_state_to_be | 判断某个元素的选中状态是否符合预期 | 布尔 |
17 | alert_is_present | 判断页面上是否存在alert | alert |
代码示例如下:
from selenium import webdriver
import os
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
path = 'file:///'+os.path.abspath('test_wait.html')
self.driver.get(path)
def test(self):
self.driver.find_element_by_id('btn').click()
# 显示等待
wait = WebDriverWait(self.driver, 3)
wait.until(EC.text_to_be_present_in_element((By.ID, 'id2'), 'id 2'))
print(self.driver.find_element_by_id('id2').text)
print('ok')
self.driver.quit()
if __name__ == '__main__':
case = TestCase()
case.test()
当 wait = WebDriverWait(self.driver, 3)中的3改为1时,则会报TimeoutException错误;如果没有显示等待,则会报NoSuchElementException。
html的页面代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<script>
function f(){
window.setTimeout("populate()",2000);
}
function populate(){
document.getElementById("id1").innerHTML = "<div id='id2'>id 2</div>"
}
</script>
<form>
<input type="text" name="t1">
<input type="button" value="Click me" onclick="f()" id="btn">
<div id="id1">
</div>
</form>
</body>
</html>