selenium使用中的注意事项
选择元素报错的情况
1 元素未加载
有时,受限于网速,抓取元素时网页还没有加载完成,因此会出现报错的情况。这种情况,只需要加入等待或者延时操作即可,selenium提供了隐式等待函数implicitly_wait()
。隐式等待表示在自动化实施过程中,为查找页面元素或者执行命令设置一个最长等待时间。如果在规定时间内页面元素被找到或者命令被执行完成,则执行下一步,否则继续等待直到设置的最长等待时间截止。更多详细的关于等待的命令,可参考selenium之WebDriverWait类(等待机制)
2 页面弹窗,元素被遮挡
有些网站打开时,会不时有弹窗出现,这时也会出现元素被遮挡导致无法选择元素。操作就是,在会弹窗的网页加一个关闭弹窗的操作。以web of science网站为例,用firefox打开时,总会弹窗
只要点击NO THANKS按钮即可关闭弹窗。No thanks 按钮的selector为div.pendo-mock-flexbox-element:nth-child(1)
,因此可用如下代码关闭
driver.find_element_by_css_selector('div.pendo-mock-flexbox-element:nth-child(1)').click()
点击出错的几种情况
1 元素被遮挡
selenium点击时,要求被点击的元素是在页面可见范围内的,如果元素被遮挡,点击会报错。此情况通常发生于具有滑轨的网页。保证能够点击到的方法是,将被点击元素置于显示范围内。可采用如下代码实现
driver.execute_script("arguments[0].scrollIntoView();", element)
其中,driver
是selenium.webdriver
生成的浏览器对象,element
是要显示的元素。
但是在使用中发现,有的时候,将网页移动到指定元素处,仍然不能点击,需要移动到相邻元素处才可以点击(增加一个移动的余量,保证元素肯定能显示在页面之内)。
注意事项:移动页面后,需要重新选择元素,不然有可能报错
element is not attached to the page document
2 点击位置无效
selenium点击时,可能会出现点击无效的情况,表现为不报错,但是点击没反应。这有可能是点击的位置不对。
以web of science 的期刊浏览页面为例,通过领域筛选期刊时,Robotics领域的元素如下所示,其id为mat-checkbox-269
但是,对此元素进行点击是无效的,因为click()默认对元素的中心点击,但是这个元素的中心不能点击。有效的点击范围是选择框和Robotics文本区域,见下图。因此需要抓取对应的有效点击元素,在此例中,有效元素的selector为#mat-checkbox-269 > label