03 selenium获取超链接元素

819 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

「selenium实战专栏」将记录selenium实战(Python版)过程,以及各类问题的解决方案。

大致规划如下:

  • 利用Element UI组件库联系对各种元素的操作
  • 利用一个真实网站进行部分页面UI自动化实战

使用版本如下:

  • Python 3.10.6
  • selenium 4.0.5

上节通过ElementUI提供的「基础用法」的按钮练习了三种获取元素的方式,今天通过ElementUI提供的超链接元素练习其他获取元素的方式。

selenium获取超链接元素

上节提到selenium提供了8种获取元素的方式,其中LINK_TEXTPARTINAL_LINK_TEXT是专门用来获取超链接元素的,前者是完全匹配,后者是模糊匹配。

访问Element UI官网,找到超链接组件,首先还是通过元素右键【检查】查看元素DOM结构,可以看到「基础用法」下的default是超链接元素,并且从可以看到它链接到Element UI官网。

接下来的任务就是获取到这个超链接元素,并且点击。上节提供了两种浏览器控制台的调试方案:

  • document.getElementsByClassName('xxx') 用于调试通过class获取元素
  • $x('xpath') 用于调试通过xpath获取元素

本节将提供另外一种调试方案,主要思路是获取到所有满足条件的元素,然后通过js语句设置元素的边框,然后截图保存。

拿超链接元素举例,如果不知道通过default文本是否可以定位到唯一的超链接元素,可以先通过find_elements获取到所有的元素,然后对获得的元素都执行js语句绘制边框。具体代码如下图所示:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

service = Service(executable_path='/Users/huyanping/Softwares/chromedriver')
driver = webdriver.Chrome(service=service)

driver.get("https://element-plus.gitee.io/zh-CN/component/link.html")

# 隐式等待,暂时可以先不用管
driver.implicitly_wait(10)
# element-ui页面会请求一些外部页面,导致需要很长时间的等待,
# 可以设置超时时间避免需要等待很长时间,但是可能会导致元素还没加载出来,可以根据自己的网络对超时时间进行调整
driver.set_page_load_timeout(6)

# 通过JS语句设置元素属性style arguments是参数
js = "arguments[0].setAttribute('style', arguments[1]);"
# css语句,给元素添加边框
style = "border: 5px solid red;"
elements = driver.find_elements(By.LINK_TEXT, 'default')
for index in range(len(elements)):
    # 执行JS语句,将元素作为参数传递
    driver.execute_script(js, elements[index], style)

driver.get_screenshot_as_file("截图.png")

# 因为点击操作执行完成后,很快就会关闭浏览器无法看到效果,调试的时候可以先注释掉
# 但是要记得自己手动关闭浏览器,避免开很多的浏览器未关闭消耗电脑内存
# driver.quit()

执行脚本后,查看保存的截图,可以看到通过default文本定位到了两个元素,包括「基础用法」中的元素和「禁用状态」中的元素。

因为我们需要取第一个超链接元素,然后进行点击,代码修改如下:

elements = driver.find_elements(By.LINK_TEXT, 'default')
elements[0].click()

运行脚本,可以看到成功点击了default超链接文本,并且打开了新的标签页,访问了Element UI官网。

PARTIAL_LINK_TEXTLINK_TEXT用法基本一致,唯一不同的是对文案进行模糊匹配,同样可以使用上面的调试脚本,将查询元素的方式改为elements = driver.find_elements(By.PARTIAL_LINK_TEXT, 'i'),查找所有包含i的超链接元素。

执行脚本,查看截图,可以看到所有包含i的超链接元素全部被框起来了。