34-在页面中寻找元素
12.8.2 在页面中寻找元素
WebDriver 对象有好几种方法用于在页面中寻找元素。它们被分成 find_element_* 和 find_elements_* 方法。 find_element* 方法返回一个 WebElement 对象,代表页面中匹配查询的第一个元素。 find_elements\* 方法返回 WebElement_* 对象的列表,包含页面中所有匹配的元素。
表12-3展示了 find_element_* 和 find_elements_* 方法的几个例子,它们在变量 browser 中保存的 WebDriver 对象上调用。
| 方法名 | 返回的WebElement对象/列表 |
| :----- | :----- | :----- | :----- |
| browser.find_element_by_class_name( name ) browser.find_elements_by_class_name( name ) | 使用CSS类 name 的元素 |
| browser.find_element_by_css_selector( selector ) browser.find_elements_by_css_selector( selector ) | 匹配CSS selector 的元素 |
| browser.find_element_by_id( id ) browser.find_elements_by_id( id ) | 匹配 id 属性值的元素 |
| browser.find_element_by_link_text( text ) browser.find_elements_by_link_text( text ) | 完全匹配提供的 text 的 <a> 元素 |
| browser.find_element_by_partial_link_text( text ) browser.find_elements_by_partial_link_text( text ) | 包含提供的 text 的 <a> 元素 |
| browser.find_element_by_name( name ) browser.find_elements_by_name( name ) | 匹配 name 属性值的元素 |
| browser.find_element_by_tag_name( name ) browser.find_elements_by_tag_name( name ) | 匹配标签 name 的元素 (大小写不敏感, <a> 元素匹配 'a' 和 'A' ) |
除了 *_by_tag_name() 方法,所有方法的参数都是区分大小写的。如果页面上没有元素可匹配该方法要查找的元素,那么 selenium 模块就会抛出 NoSuchElement 异常。如果你不希望这个异常让程序崩溃,就在代码中添加 try 和 except 语句。
一旦有了 WebElement 对象,就可以读取表12-4中的属性,或调用其中的方法,并了解它的更多功能。
| 属性或方法 | 描述 |
| :----- | :----- | :----- | :----- |
| tag_name | 标签名,例如 'a' 表示 <a> 元素 |
| get_attribute(name) | 该元素 name 属性的值 |
| text | 该元素内的文本,例如 <span>hello 中的 'hello' |
| clear() | 对于文本字段或文本区域元素,清除其中输入的文本 |
| is_displayed() | 如果该元素可见,返回 True ;否则返回 False |
| is_enabled() | 对于输入元素,如果该元素启用,返回 True ;否则返回 False |
| is_selected() | 对于复选框或单选按钮元素,如果该元素被勾选,返回 True ;否则返回 False |
| location | 一个字典,包含键 'x' 和 'y' ,表示该元素在页面上的位置 |
例如,打开一个新的文件编辑器,输入以下程序:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('https://inv')
try:
elem = browser.find_element_by_class_name(' cover-thumb')
print('Found <%s> element with that class name!' % (elem.tag_name))
except:
print('Was not able to find an element with that name.')
这里我们打开FireFox,让它指向一个URL。在这个页面上,我们试图找到带有类名 'cover-thumb' 的元素。如果找到这样的元素,我们就用 tag_name 属性将它的标签名输出。如果没有找到这样的元素,就输出不同的信息。
这个程序的输出结果如下:
Found <img> element with that class name!
我们发现了一个元素带有类名 'cover-thumb' ,它的标签名是 'img' 。