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

问题就是搜索百度的关键词结果页面,然后随机点击这个页面的链接,我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)
巴扎黑
巴扎黑

répondre à tous(2)
小葫芦

J'utilise également du sélénium récemment et le problème est très similaire à celui que vous avez rencontré. C'est la même page. Après avoir trouvé l'élément, on peut parfois cliquer plusieurs fois dessus, et parfois cela ne fonctionnera pas après quelques fois.

Plus tard, j'ai trouvé un problème, find_elements_by_xpath ou id, text, css, la liste renvoyée, comme vos classements, la position des valeurs​​dans celle-ci va changer, cela ressemble à un dictionnaire, après les classements[1 ] est utilisé, la prochaine fois, peut-être que les rangs [1] ne peuvent pas être trouvés. Je ne sais pas pourquoi je l'ai imprimé et il semble que l'adresse mémoire change. Donc, si je la trouve une fois, les positions des éléments. dans cette liste sera foiré la prochaine fois. Peut-être que je ne le trouve pas moins.

Au final, je n'ai pu trouver qu'une seule fois, cliquer sur un élément de la liste et en supprimer un. Après avoir cliqué sur toute la liste, la liste était vide. Repositionnez puis recherchez.

Il y a un gros problème au milieu, c'est-à-dire que lorsque vous parcourez cette liste, il est préférable de ne pas dormir au milieu. Si vous dormez une seconde comme celle-ci, l'élément de la liste a peut-être changé. sa position et est introuvable, je ne sais pas pourquoi, mais cela devient de plus en plus compliqué avec le temps.

J'ai configuré qu'après avoir parcouru la même page Web 40 fois, la page Web entière sera actualisée et la recherche sera repositionnée. Il peut fonctionner en continu pendant 15 heures sans aucun problème.

J'ai déjà essayé d'actualiser et de retrouver, mais cela consomme beaucoup de mémoire et de CPU.

En bref, les éléments de la liste des classements doivent être constamment mis à jour.

Il existe un autre package splinter, qui n'est pas très utile non plus.

黄舟

Dans certains cas, vous devez définir la taille de la fenêtre. Vous pourriez aussi bien démarrer le pilote et le configurer pour le maximiser
Je n'ai jamais rencontré le deuxième problème, donc je ne dirai pas de bêtises - -<.>

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal