python - 用selenium,出现这个错误: WebDriverException
巴扎黑
巴扎黑 2017-04-17 17:59:05
0
2
334

问题就是搜索百度的关键词结果页面,然后随机点击这个页面的链接,我xpath是这样写的

先找到每个排名结果的区域块,
list1 = browser.find_elements_by_xpath('//*[@class="result c-container "]')

这个时候会得到一个列表,列表的每个对像就对应的一个排名的结果所在的区域块,然后在随机抽取这个列表中的块来进行点击(点击第三个排名结果):
list1[2].find_element_by_xpath('h3/a').click()

但是我再运行代码的时候,有的时候可以点击有的时候又不能点击,同样的页面~,相当不稳定,出错是这样的,百度也不能找到相关的答案


问题2,针对上一个问题的升级,我点击一个链接,就会出现新窗口(具体的搜索结果网站),我把窗口切换过去,然后随便浏览一下,在关闭窗口,然后把句柄在切换回来,这个时候,在进行点击的时候~发现又不行~~出现同样的错误,但是有的时候如果把等待时间设置长了又可以~,但是又测试又不行~
总之一句话,不稳定!!不知道高手知道这个要怎么解决?
下面是完整代码:

#coding:utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time,datetime
from random import choice
import random

def get_ele_times(browser,times,func):
    return WebDriverWait(browser,times).until(func)

browser = webdriver.Firefox()
browser.get('https://www.baidu.com/s?wd=张特')
get_ele_times(browser,10,lambda brower: brower.find_element_by_id('content_bottom'))
now = browser.current_window_handle     #主要浏览器句柄
ranks = browser.find_elements_by_xpath('//*[@class="result c-container "]')
序号 = random.sample(range(len(ranks)), random.randint(2,5))

for i in 序号:
    ranks = browser.find_elements_by_xpath('//*[@class="result c-container "]')
    ranks[i].find_element_by_xpath('h3/a').click()
    time.sleep(1)
    allhandles = browser.window_handles
    for handle in allhandles:
        if handle != now:
            browser.switch_to_window(handle)    #切换成新窗口
    browser.close() #再关闭
    browser.switch_to_window(now)   #再切换回来
    get_ele_times(browser,10,lambda brower: brower.find_element_by_id('content_bottom'))
    time.sleep(10)
巴扎黑
巴扎黑

全部回覆(2)
小葫芦

我最近也在用selenium,跟你遇到的問題很像。就是相同的頁面,找到元素後,有時能點很多次,有時幾次就不行了。

後來我發現有個問題,find_elements_by_xpath或id,text,css,這個返回的列表,比如你這個ranks,裡面的值的位置會變,感覺像字典,ranks[1]用過之後,下次可能就找不到ranks[1]了,我也不知道是什麼原因,我print出來看,似乎是內存地址在變,所以找到一次,這個列表裡的元素下一次的位置會亂掉,可能找不到。

最後我只能find一次之後,列表裡的元素點擊一個,remove一個,整個列表點擊完之後,列表為空。再重新定位,然後find。

中間有個很大的問題,就是你在循環遍歷這個列表的時候,中間最好不要sleep,像你這樣sleep一秒鐘,剛才列表裡的元素可能又變了位置,找不到,不知道為什麼,時間越長越容易亂。

我設定在同一個網頁循環40遍之後,整個網頁刷新一遍,重新定位find。這樣連續運轉15個小時沒問題。

之前我試過,刷新一遍,find一遍,但是這樣很費內存和cpu。

總之就是ranks這個清單裡的元素,需要不斷更新。

另外有一個splinter包,也不是很好用。

黄舟

有些情況下需要設定視窗大小,不妨啟動driver之後設定一下最大化試試
第二個問題沒有遇到過,就不瞎說了 - -

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!