利用无头浏览器对网页元素进行模拟操作时经常遇到的问题就是**元素不存在这样的错误。原因大概有这么几种。

  1. 网页没有加载完成,因此定位不到元素
  2. 网页元素显示样式设置为不可见,即display:none,常见的如一些悬停显示的菜单。
  3. 元素在iframe 中,常见的情况比如腾讯网站的登录框。
    一般来讲,在网页源代码中能够看到的且display属性设置为可见的元素,selenium等工具才能够正常定位,要不然就会出现元素不存在的错误。

第2种情况可以使用一些模拟行为触发不可见的元素,或者调用jsjquery修改display属性。
第3种情况selenium可以使用switch_to_frame()切换iframe

本文重点说下第一种情况,网页只有完全加载,元素才可能被定位,但是网页是否加载完成又该怎么判断、处理呢。
常见处理方法如下:

  1. time.sleep()直接等待几秒钟,等待网页加载完成,这种方法很死板,网页加载是否加载也不能预测,只能撞大运,但也是最简单的一种方法。
  2. selenium的driver.implicitly_wait(),隐式等待,全局性设置,只用设置一次就可以。
  3. selenium的WebDriverWait(driver, 100).until(lambda x: x.find_element_by_xpath('.WB_FEED')),显式等待
  4. spynner的br.wait_for_content(lambda br: 'WB_feed' in br.html),类似于selenium的显式等待
  5. spynner的各类操作,如load、click等等操作均内置了等待内容加载的参数,原来的参数如br.click('div.login-switch', wait_load=True),新版的参数形式如br.load("html_controls.html", 1, wait_callback=wait_load)
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐