点击隐藏菜单:
selenium包中ActionChains类给出的示例如下:
menu = driver.find_element_by_css_selector(".nav") hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1") actions = ActionChains(driver) actions.move_to_element(menu) actions.click(hidden_submenu) actions.perform()
这段代码的整体思路就是:
如果直接使用elem.click()
方法点击不可见元素会报元素不可见的错误:element not visible
点击弹出层:
1. Alert(警告信息)
Alert弹出框,目的就是显示通知信息,只需用户看完信息后,点击OK(确定)就可以了。
Selenium提供如下方法进行操作:
# 点击OK(确定)按钮 driver.switch_to.alert.accept() # 获取弹出框的信息内容 driver.switch_to.alert.text
注意:如果我们不去点击它,页面的其它元素是不能操作的。
2. Confirm(确认信息)
Confirm弹出框,主要是让用户确认是否要进行某个操作。 有两个选择供用户选择,分别是OK(确定)和Cancel(取消)。
Selenium提供如下方法进行操作:
# 点击OK(确定)按钮 driver.switch_to.alert.accept() # 点击Cancel(取消)按钮 driver.switch_to.alert.dismiss()
3. Prompt(提示输入)
出现Prompt弹出框是需要用户输入一些信息,提交上去。
Selenium提供如下方法进行操作:
driver.switch_to.alert.send_keys()
使用上面两种方法死活都定位不到的弹出层
遇到这个问题做了以下尝试:
1.首先,这种肯定不是alert,所以不能用alert去定位
2.然后看看是不是有iframe,查看元素后,发现没有iframe
3.前面加了sleep时间等待也无法解决
解决方法:
1.通过打印获取全部的窗口,发现打印出来的是两个handle,也就是说,这个表面上看起来是一个窗口,实际上内嵌了另外一个窗口.
# 打印所有的handle all_handles = driver.window_handles print(all_handles) # 切换到新的handle上 driver.switch_to.window(all_handles[-1])
2.找到问题原因,接下来就简单了,先切换到新的窗口上,然后用平常的定位方法就可以了
但如果是在循环中这样写的话需要将 driver
对象在每次循环开始的时候重置为当前操作的窗口.
不然会报错找不到正常网页窗口中的对象.
循环的例子:
for i in range(0, 15): # 打印所有的handle all_handles = driver.window_handles print(all_handles) # 切换到主页面的handle上 driver.switch_to.window(all_handles[-1]) a_title = test.get_attribute('title') if a_title == '恢复页面': # 获取确认提示弹窗对象 # 打印所有的handle all_handles = driver.window_handles print(i, all_handles) # 切换到新的handle上 driver.switch_to.window(all_handles[0]) # 找到弹窗内的确认按钮 alertbox_btn = driver.find_element(by=By.CSS_SELECTOR, value='p.from-btn>a.ok') # 点击确认按钮 alertbox_btn.click() sleep(2)
其他实用辅助方法:
滚动条操作:
将滚动条定位至指定元素可见:
# 将滚动条定位至指定元素可见 driver.execute_script('arguments[0].scrollIntoView()', elem) # 移动到元素的‘低端’与当前窗口的‘底部’对齐 driver.execute_script('arguments[0].scrollIntoView(false)', elem) # 移动到元素的“顶端”与当前窗口的“顶部”对齐 driver.execute_script('arguments[0].scrollIntoView(true)', elem)
获取元素大小,位置坐标:
获取元素的宽高(大小)
# 打开百度 driver.get("https://www.baidu.com") # 定位百度搜索输入框元素 ele = driver.find_element(By.XPATH, "//input[@id='kw']") # 获取元素大小 ele_size = ele.size print(type(ele_size)) print(ele_size)
输出结果:
<class 'dict'> {'height': 44.0, 'width': 548.0}
获取元素的位置坐标:
# 打开百度 driver.get("https://www.baidu.com") # 定位百度首页的地图按钮 ele = driver.find_element(By.XPATH, "//a[@class='mnav c-font-normal c-color-t']") # 获取元素的位置 ele_location = ele.location print(ele_location)
输出结果:
{'x': 24, 'y': 19}
判断元素是否可以点击,选中,是否可见:
1.判断元素是否可以点击
判断元素是否可以点击,WebElement对象调用is_enabled()
is_enabled()方法返回一个布尔值,若可点击返回:True。若不可点击则返回:False
driver = webdriver.Chrome() # 打开百度 driver.get('https://www.baidu.com/') # 定位百度首页的地图按钮 elm = driver.find_element(By.XPATH, '//*[@id="s-top-left"]/a[3]') # 判断元素是否可以点击 answer = elm.is_enabled() print(answer) time.sleep(3) driver.quit() #####输出结果:##### True
2.判断元素是否可见
判断元素是否可见,WebElement对象调用is_displayed()
is_displayed()方法返回一个布尔值,若可见则返回:True。若不可见则返回:False
driver = webdriver.Chrome() # 打开百度 driver.get('https://www.baidu.com/') # 定位百度首页的地图按钮 elm = driver.find_element(By.XPATH, '//*[@id="s-top-left"]/a[3]') # 判断元素是否可见 answer = elm.is_displayed() print(answer) driver.quit() #####输出结果:##### True
3.判断元素是否可被选中
判断元素是否被选中,WebElement对象调用is_selected()
is_selected()方法返回一个布尔值,若可见则返回:True。若不可见则返回:False
driver = webdriver.Chrome() # 打开百度 driver.get('https://www.baidu.com/') # 定位百度首页的地图按钮 elm = driver.find_element(By.XPATH, '//*[@id="s-top-left"]/a[3]') # 判断元素是否可选中 answer = elm.is_selected() print(answer) driver.quit() #####输出结果:##### False
-End-