问题就是搜索百度的关键词结果页面,然后随机点击这个页面的链接,我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)
私も最近 Selenium を使用していますが、問題はあなたが遭遇した問題と非常によく似ています。同じページですが、要素を見つけた後、何度もクリックできる場合と、数回クリックしても機能しなくなる場合があります。
後で問題が見つかりました。find_elements_by_xpath または ID、テキスト、CSS、ランクなどの返されたリスト、その中の値の位置が変わります。ランキングの後、辞書のように感じます[1 ] を使用すると、次回は、ranks[1] が見つからないため、メモリアドレスが変更されているようです。次回はこのリストがめちゃくちゃになるかもしれません。
結局、リスト内の 1 つの要素をクリックして 1 つを削除することしかできませんでした。リスト全体をクリックすると、リストは空になりました。位置を変更してから検索します。
途中で大きな問題があります。つまり、このリストをループしているときは、途中でスリープしないほうがよいのです。このように一瞬スリープすると、リスト内の要素が変更されている可能性があります。理由はわかりませんが、時間が経つにつれてさらに厄介になります。
同じ Web ページを 40 回ループした後、Web ページ全体が更新され、検索の位置が変更されるように設定しました。 15時間の連続使用も問題なく行えます。
以前に更新して再度検索しようとしましたが、これは大量のメモリと CPU を消費します。
つまり、ランク リストの要素は常に更新する必要があります。
別の破片パッケージがありますが、これもあまり役に立ちません。
場合によっては、ウィンドウ サイズを設定する必要があります。ドライバーを起動して最大化するように設定することもできます。
私は 2 番目の問題に遭遇したことがないので、くだらない話はしません - -