selenium踩坑笔记
1、遍历表格数据,使用元素.text方法,有些数据的值不为空,但遍历出来的值却为空,例子如下
eles=driver.find_elements_by_xpath("XXX") for ele in eles: name=ele.text
这种方法获取的name,可能有存在name有值,但获取到的是空字符串的情况。
解决办法:如果通过get_attribute()属性值获取的方法可以替代text方法尽量用此方法替代,如下:
eles=driver.find_elements_by_xpath("XXX") for ele in eles: name=ele.get_attribute("title")
经验证,通过get_attribute()获取文本的方法比text稳定。
2、execute_script() 方法执行 JavaScript 的来解决页面上一些 selenium 无法操作的元素,但是一直无法获取执行的返回值
js = 'document.getElementById("Frank");' Frank = driver.execute_script(js) print(blog) # 返回元素对象,结果返回为None
解决办法:在JS语句前面加上return,才能返回元素对象。eg: js = 'return document.getElementById("Frank");'
3、元素明明存在,但是死活定位不到(不存在frame的问题)
eg:需要定位到一个checkbox框,但是通过xpath定位,同层级的span元素("//*[FrankTable]/tbody/tr[2]/td[3]/lable/span]")定位到了,checkbox元素("//*[FrankTable]/tbody/tr[2]/td[3]/lable/input]")却定位不到
解决办法:
使用JS语句进行定位,代码如下
js='return document.querySelector("#FrankTable");' checkbox=self.driver.execute_script(js)
4、selenium.common.exceptions.StaleElementReferenceException: Message:stale element reference: element is not attached to the page document
def DeleteAllCourse(driver): while 1: #保证每次删除完按钮重新获取元素,当删除按钮数量为0时退出循环 delButtons = driver.find_elements_by_name('li') if len(delButtons)<1: break delButtons[0].click() time.sleep(1)
5、弹窗定位不到(没frame)
解决办法:
handles = driver.window_handles #获取所有窗口
print(handles)
查看所有窗口,如果有多余窗口,说明改弹窗以窗口的形式存在,相当于表面上看起来是一个窗口,实际上内嵌了另外一个窗口了。
driver.switch_to.window(handles[1]) #切换窗口
6、class属性有空格,定位不到元素。
eg:<span class="name test" username="qq_41952323">Dance Wang</span>
driver.find_element_by_class_name("name test")无法定位
解决办法:
以空格为分界线,相当于两个 class属性值,两个属性值都可以进行定位。
driver.find_element_by_class_name("name") or driver.find_element_by_class_name("test")都可进行定位
7、一个普通的添加按钮并带有唯一ID,点击后无反应(用了js点击也没反应)
解决办法:使用鼠标模拟双击。
from selenium.webdriver.common.action_chains import ActionChains
ele = driver.find_element_by_id("id")