废话不多说,直接上图:
当鼠标移动到导入按钮上时,下载模板等列表选项才会显示。
因此,直接定位列表项肯定是定位不到的。
这时我们可以使用ActionChains(动作链)方法,模拟鼠标悬停,去实现定位该元素并点击。
示例代码片段:
注:常用元素操作方法已做个人二次封装,改为通用写法即可,直接搬运到你的代码中不好使哟^ _ ^
from selenium.webdriver.common.action_chains import ActionChains
class Test_bill:
def test_clickimport(self):
# 鼠标悬停导入按钮,点击列表元素
button = self.web.find(
'//*[@id="app"]/div/div[2]/div[2]/div/div[1]/div/div/div/div[3]/div[1]/div[2]/div[1]/button/span')
ActionChains(self.web.driver).move_to_element(button).perform()
time.sleep(2)
self.web.click('//ul[contains(@id,"dropdown-menu")]/div[1]/div/li')
time.sleep(2)
首先,定位悬停元素位置,即导入按钮的位置,放入变量button;
然后,move_to_element()移动到元素上;
最后,perform()执行动作链中的所有动作。
当调用ActionChains的方法时,不会立即执行,而是会将所有的操作按顺序存放在一个队列里。
调用perform()方法时,队列中的事件会依次执行。
当然也可以采取一链到底的写法,虽然理论上没有语法错误,但不推荐这么写:
ActionChains(self.web.driver).move_to_element(mouse).click(hiddenMenu).perform()
因为鼠标悬停之后,隐藏列表展开需要一定的时间,会导致定位在元素加载出来之前已经执行,click事件点不到。
因此将点击隐藏列表选项的操作单独执行,并在此之前添加固定等待时间,确保稳定性。
另附:以下搬运过来的ActionChains主要方法
- context_click()–此方法对页面元素执行右键单击操作。
- click_and_hold()–此方法执行将鼠标左键按住到页面元素上的操作。
- click()-此方法对页面的元素执行单击操作。
- double_click()-此方法对页面的元素执行双击操作。
- drag_and_drop()-此方法执行在源元素上按住鼠标左键的操作。然后移动到目标元素,最后释放鼠标按钮。
- drag_and_drop()-此方法执行在源元素上按住鼠标左键的操作。然后移动到目标元素,最后释放鼠标按钮。
- drag_and_drop_by_offset()-此方法执行将鼠标左键按住在源元素上的操作。然后移动到目标偏移量元素,最后释放鼠标按钮。
- move_to_element()-此方法将鼠标移动到页面上元素的中间。
- move_by_offset()-此方法将鼠标移动到距鼠标当前位置的偏移处。
- key_up()–此方法释放修饰键。
- key_down()–此方法仅执行发送按键操作,而不释放按键。
- release()–此方法执行释放元素上按住的鼠标按钮的操作。
- pause()-此方法在特定时间段内停止所有输入。
- perform()-此方法执行一个接一个地排队的所有动作。
- move_to_element_with_offset()-此方法将鼠标移动页面上指定元素的元素的偏移量。偏移量是相对于元素的左上角。
- send_keys()–此方法执行将键发送到当前焦点的操作。
- reset_actions()–此方法执行重置存储在本地以及远程上的所有操作的操作。