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

原因:现在的web应用和以前大不相同,以前的web应用大都是后端直接产生最终的html界面,而现在呢?很多是页面加载后(也加载javascript前端代码), 由前端代码动态改变界面的内容,比如从后端获取一些数据后,再动态改变界面的内容。
尤其是很多采用了框架像angular,react,vue这些都会这样做。这样就有一个问题,开始的时候获取的html只是一个模板一样的文档,里面的数据没有产生,而是需要等前端js代码动态的再次向后端查询数据后, 才动态的向html模板中填入数据或者修改数据。
eg:一下子获取了多个删除按钮 元素,然后用循环点击 每个删除按钮但是当点击第一个按钮之后,页面有些部分被更新了,剩余的几个按钮,虽然看起来还是原来的样子。但是已经是新的界面元素了所以,你通过原来老的 界面元素点击 ,就会出现这个错误
解决办法:
重新获取元素
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")

ActionChains(driver).double_click()(ele).perform()
 
 8、页面存在,但是不可见的元素,获取不到text
解决办法1:使其可见再进行获取。
解决方法2:直接使用js方法获取
eg:js = "return document.querySelector('.Frank').innerText"
  text = driver.execute_script(js)
解决方法3:使用get_attribute("innerText")
 
 
 

 

posted @ 2020-11-07 11:25  Frank13054  阅读(237)  评论(0编辑  收藏  举报