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)
经验分享 程序员 微信小程序 职场和发展