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'
。