Selenium一些特殊情况的处理:失去焦点、点击不生效、长页面处理、先触发事件才能动态加载的元素、日期输入
Selenium一些特殊情况的处理
失去焦点focus
有时候click()或者send_keys(),没有反应。那是因为失去了焦点。使用driver. switch_to_active_element()或者driver.execute_script("arguments[0].focus();", element)解决。
点击不生效的替代办法
首先使用EC.element_to_be_clickable()确认元素是clickable的。
然后可以尝试如下替代方法
方法1:使用回车键代替。
例如:
driver.find_element_by_xpath("//*[@id='student']/a[1]").send_keys(Keys.ENTER)
方法2:使用javascript代替。
例如:
button=driver.find_element_by_xpath("//*[@id='loginButton']")
driver.execute_script("arguments[0].click()",button) # 执行js语句
再例如:
js ='document.getElementById("password").click()' #使用 js查找然后点击元素
driver.execute_scrtip(js)
长页面
有些页面很长,为了减少流量使用,提高加载速度,这些页面常常使用AJAX实现懒加载。只有即将进入屏幕范围时才进行加载。没有加载的元素也就无法定位。
对于长页面,可以先拖动页面到底部,触发页面完成加载。
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
如果元素处于不可见区域,那么虽然可以定位到,但是不能操作。可以利用js使得元素处于可见区域。例如:
element = driver.find_element_by_name("Tom")
driver.execute_script("arguments[0].scrollIntoView();", element)
先触发事件才能动态加载的元素
对于要先触发事件才能动态加载的元素。要先触发事件,然后find_element。
如果是动态菜单,需要一级一级点击展开进入。
隐藏菜单,需先鼠标悬停在按钮上,出现子菜单,然后才可以点击子菜单。
示意举例:
ActionChains(driver).move_to_element("父菜单按钮").perform()
driver.find_element_by_link_text("子菜单项").click()
日期输入
很多时候,对于日期输入框,不允许直接输入,而是必须使用日期控件选择,selenium定位时不方便。可以使用js将readonly属性去掉。例如:driver.execute_script("document.getElementById('date').removeAttribute('readonly')")。这样selenium就可以直接在文本框里输入日期。
本文地址:https://blog.csdn.net/jxzdsw/article/details/107366545