问题就是搜索百度的关键词结果页面,然后随机点击这个页面的链接,我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,text,css,这个返回的列表,比如你这个ranks,里面的值的位置会变,感觉像字典,ranks[1]用过之后,下次可能就找不到ranks[1]了,我也不知道是什么原因,我print出来看,似乎是内存地址在变,所以找到一次,这个列表里的元素下一次的位置会乱掉,可能找不到。
最后我只能find一次之后,列表里的元素点击一个,remove一个,整个列表点击完之后,列表为空。再重新定位,然后find。
中间有个很大的问题,就是你在循环遍历这个列表的时候,中间最好不要sleep,像你这样sleep一秒钟,刚才列表里的元素可能又变了位置,找不到,不知道为什么,时间越长越容易乱。
我设置在同一个网页循环40遍之后,整个网页刷新一遍,重新定位find。这样连续运行15个小时没问题。
之前我试过,刷新一遍,find一遍,但是这样很费内存和cpu。
总之就是ranks这个列表里的元素,需要不断更新。
另外有一个splinter包,也不是很好用。
有些情况下需要设置窗口大小,不妨启动driver之后设置一下最大化试试
第二个问题没有遇到过,就不瞎说了 - -