主要技术内容:多种等待及多窗口切换
1、定位不到可能原因?
- 没加等待,页面没加载完成,或是元素没加载出来;
- 有frame,其他windows
- 你定位的选择错了:xpath写错了,定位不是这个了
- 上次出现这个元素,这次运行元素不出现。
2、等待有几种方式
- 强制等待
time.sleep(3)
死等 - 隐性等待
driver.implicitly_wait(10)
如果页面加载上了,不需要10秒,如果页面10秒没加载完,抛异常
页面是全局的-全部加载完。
对整个driver的周期都起作用。
- 显示等待
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
path='/Users/lindafang/PycharmProjects/selenium3forpython2020/driver/chromedriver'
driver = webdriver.Chrome(executable_path=path)
# 隐式等待,全局10秒
driver.implicitly_wait(10)
driver.get("https://cn.bing.com/")
elem=driver.find_element_by_id("sb_form_q")
elem.send_keys("seleniumhq"+Keys.RETURN)
assert 'selenium' in driver.page_source
# 显示等待10秒
wait = WebDriverWait(driver,10)
original_window=driver.current_window_handle
assert len(driver.window_handles)==1
driver.find_element_by_partial_link_text("selenium中文网").click()
# 等待走到切换到第二个窗口
wait.until(EC.number_of_windows_to_be(2))
# 切换到不是原来的那个窗口
for window_handle in driver.window_handles:
print(window_handle)
if window_handle!=original_window:
driver.switch_to.window(window_handle)
break
# 等待新窗口的title包含""
wait.until(EC.title_contains("selenium中文网"))
print(driver.title)
driver.close()
driver.quit()
- 显示等待有条件
1、验证title的,验证传入的参数title是否等于或包含在driver.title中
title_is
title_contains
2、验证元素是否出现 ,传入的参数都是元组类型的locator(By.ID,'q')
wait = WebDriverWait(driver,10)
wait.until(EC.presence_of_element_located)
wait.until(EC.presence_of_all_elements_located)
3、验证元素是否可见
wait = WebDriverWait(driver,10)
wait.until(EC.visibility_of_all_elements_located)
wait.until(EC.visibility_of_any_elements_located)
wait.until(EC.visibility_of_element_located)
4、判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value
wait = WebDriverWait(driver,10)
wait.until(EC.text_to_be_present_in_element)
wait.until(EC.text_to_be_present_in_element_value)
5、判断是否有alert出现
wait.until(EC.alert_is_present)
6、判断元素是否被选中
wait.until(EC.element_to_be_clickable)
wait.until(EC.element_to_be_selected)
附:[selenium keys模块]
Keys模块解释
NULL = '\ue000'
CANCEL = '\ue001' # ^break
HELP = '\ue002'
BACKSPACE = '\ue003'
BACK_SPACE = BACKSPACE #删除键
TAB = '\ue004' #TAB键
CLEAR = '\ue005'
RETURN = '\ue006'
ENTER = '\ue007' #回车键
SHIFT = '\ue008' #Shift键
LEFT_SHIFT = SHIFT
CONTROL = '\ue009'
LEFT_CONTROL = CONTROL #Ctrl 键
ALT = '\ue00a' #Alt 键
LEFT_ALT = ALT
PAUSE = '\ue00b'
ESCAPE = '\ue00c' #ECS键
SPACE = '\ue00d' #空格键
PAGE_UP = '\ue00e' #PgUp 键
PAGE_DOWN = '\ue00f' #PgDwon 键
END = '\ue010' #END 键
HOME = '\ue011' #HOME 键
LEFT = '\ue012' #左键
ARROW_LEFT = LEFT
UP = '\ue013' #上键
ARROW_UP = UP
RIGHT = '\ue014'
ARROW_RIGHT = RIGHT #右键
DOWN = '\ue015' #下键
ARROW_DOWN = DOWN
INSERT = '\ue016' #insert键
DELETE = '\ue017' #del键
SEMICOLON = '\ue018' #';'键
EQUALS = '\ue019' #'='键
#数字键盘
NUMPAD0 = '\ue01a' # number pad keys
NUMPAD1 = '\ue01b'
NUMPAD2 = '\ue01c'
NUMPAD3 = '\ue01d'
NUMPAD4 = '\ue01e'
NUMPAD5 = '\ue01f'
NUMPAD6 = '\ue020'
NUMPAD7 = '\ue021'
NUMPAD8 = '\ue022'
NUMPAD9 = '\ue023'
MULTIPLY = '\ue024' # '*' 键
ADD = '\ue025' # '+' 键
SEPARATOR = '\ue026' #','键
SUBTRACT = '\ue027' # '-' 键
DECIMAL = '\ue028' # '.'键
DIVIDE = '\ue029' #'/'键
F1 = '\ue031' # function keys
F2 = '\ue032'
F3 = '\ue033'
F4 = '\ue034'
F5 = '\ue035'
F6 = '\ue036'
F7 = '\ue037'
F8 = '\ue038'
F9 = '\ue039'
F10 = '\ue03a'
F11 = '\ue03b'
F12 = '\ue03c'
META = '\ue03d'
COMMAND = '\ue03d'
操作组合键:</pre>
send_keys(Keys.CONTROL,'a') #全选(Ctrl+A)
send_keys(Keys.CONTROL,'c') #复制(Ctrl+C)
send_keys(Keys.CONTROL,'x') #剪切(Ctrl+X)
send_keys(Keys.CONTROL,'v') #粘贴(Ctrl+V)
回车键 Keys.ENTER
删除键 Keys.BACK_SPACE
空格键 Keys.SPACE
制表键 Keys.TAB
回退键 Keys.ESCAPE
刷新键 Keys.F5
send_keys("seleniumhq"+Keys.RETURN)
send_keys(Keys.CONTROL,'a')
网友评论