Selenium常用方法
[【错误】Selenium报错:Element is not clickable at point(x, y)原因及解决办法汇总_Jock2018的博客-CSDN博客](https://blog.csdn.net/qq_27283619/article/details/89278110)
2. 最大化浏览器窗口
这是最简单也是大多数人的问题所在。博主就是其中之一。当你的电脑的屏幕分辨率大于1024X768时,你你可以尝试最大化浏览器来解决问题。博主的是台式机,分辨率1920X080,小伙伴时笔记本。所以导致了程序在小伙伴电脑上可以运行,博主的却不行。因为窗口太小,导致元素被折叠了,无法执行一些Selenium操作。
解决办法:最大化浏览器窗口driver.maximize_window()
# 最大化窗口
driver.maximize_window()
# 自定义窗口大小
driver.set_window_size(width, height)
3. 元素还未加载
这是非常常见的原因之一,因为CPU跑得远远快于网页加载的速度,所以我们需要让程序等一下浏览器,等元素加载出来,再执行下一步操作。可以通过强制等待
、隐式等待
、显示等待
三种方法实现。这三种方法的具体区别,大家有兴趣的可以参照博主的另一篇文章爬虫入门学习(六)Selenium学习与实战,里面有对比这三种方法。
这里就简单介绍:
性能上:显示等待>隐式等待>强制等待
解决办法:
# 强制等待
from time import sleep
sleep(t) # 让线程休眠t秒
# 隐式等待
from selenium import webdriver
ff = webdriver.Firefox()
ff.implicitly_wait(10) # seconds
ff.get("http://somedomain/url_that_delays_loading")
myDynamicElement = ff.find_element_by_id("myDynamicElement")
# 显示等待,Selenium自带的WebDriverWait
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0
ff = webdriver.Firefox()
ff.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(ff, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement")))
finally:
ff.quit()
4. 元素在iframe里面
那就切换到iframe,这里需要用到switch_to_frame方法
来切换Frame。
driver.switch_to_frame("frameName") # 根据框架名来切换
driver.switch_to_frame("frameName.0.child") # 子框架
driver.switch_to_default_content() # 返回
更多请参考官方文档
5. 不在视图,下拉滚动条
很多网站的列表页不是立马返回所有内容,是根据视图来显示的。所以,我们就需要拖动滚动条来把要获取的内容显示到视窗里才可以获取到。
page = driver.find_element_by_partial_link_text(u'下一页')
driver.execute_script("arguments[0].scrollIntoView(false);", page)
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, u'下一页'))).click()
更多请参考Selenium下拉滚动条
6. 元素被覆盖
可以使用动作链来解决。
例如下拉菜单,通过hover,让子菜单显示,就可以点击了。
menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()
更多请参考官方文档