Selenium爬虫 -- 元素点击与定位的稳定方式
爬虫开发中免不了有定位难题和按钮点击拦截,我在本篇文章中总结问题,并给出目前我的解决方案。
问题一:定位不稳定,时而有时而无
xpath的定位方式确实好用,但是定位字符串的编写也是门技术活。
解决方法:绝对路径、相对路径、树形、属性寻找等,这些的示例为:
# 树形文本结构寻找,绝对路径,最不稳定 articles = browser1.find_elements_by_xpath(/html/body/div[7]/div[3]/div/div/div/div/div/div[2]/div/div) # 树形文本结构寻找,相对路径,较为稳定 name = article.find_element_by_xpath(./div/div[1]/span/div/span/a/span) # 根据属性寻找(最稳定),绝对路径,找到整个页面中的第一个 # //div articles = self.browser1.find_element_by_xpath(//div[@class="occludable-update ember-view"]) # 根据属性寻找(最稳定),相对路径,找到父元素下的第一个 # .//div articles = self.browser1.find_element_by_xpath(.//div[@class="occludable-update ember-view"])
问题二:点击按钮无效,被拦截等原因
点击按钮会出现报错误:Element Click Intercepted Exception : element click intercepted之类的。
解决方法:可以使用先延时再点击,这样确保浏览器接收到元素,就能定位到。或者改成下面的点击执行方法。或者延时+下面的方法。
# 找到元素 mbs = self.browser1.find_element_by_xpath(//button[@class="comments-comments-list__load-more-comments-button"]) # 这样执行点击 self.browser1.execute_script("arguments[0].click();", mbs)
问题三:for循环的定位问题,不能顺利定位下一个大元素中的小元素
在循环中顺利进入下一次循环,读取了列表中下一个元素,但是小元素却仍旧定位了原来的?别慌,IDEA告诉了你答案。(我也是鼠标挪上去,不小心看到的,运气型编程hhh)
解决方法:属性定位也要用相对路径。
# .// 和 // 是不一样的 li = article.find_element_by_xpath(.//li[@class="social-det"]) tb = li.find_element_by_xpath(./button) self.browser1.execute_script("arguments[0].click();", tb)