selenium元素定位

439 阅读4分钟

一、slenium定位动态id

在实际定位时有可能会出现动态的id。这个时候若是使用xpath定位等方式可能本次可使用,下次使用时这种定位方式就失效了!所有定位动态元素也是必备技术之一

  1. 定位方式一:xpath,使用xpath表达式识别元素,xpath也支持多种属性来确定元素位置如id,class等
  2. 定位方式二:css选择器。类似于xpath,css选择器同样允许使用多种属性来选择元素
  3. 定位方式三:使用相对定位的方式。如果元素周围有其他元素则可以使用相对定位来找到该元素,例如如果该元素是其父元素的第二个子元素,则可以使用find_elements方法找到所有子元素并选取第二个

使用通配符来匹配动态 ID

可以在 XPath 中使用 contains 或 starts-with 函数。

contains 函数可以用于查找包含特定字符串的属性值。例如,要查找所有 ID 包含 “example” 的元素,可以使用以下 XPath 表达式:

//*[contains(@id, 'example')]

starts-with 函数可以用于查找以特定字符串开头的属性值。例如,要查找所有 ID 以 “example” 开头的元素,可以使用以下 XPath 表达式:

//*[starts-with(@id, 'example')]

请注意,这些表达式可能会返回多个匹配项。如果您需要更具体的定位,请根据实际情况使用其他属性过滤器或组合多个条件。

 find_elements_* 方法

在 Selenium 中找到多个匹配元素,则可以按照以下方式获取第一个匹配元素:

python复制代码
elements = driver.find_elements_by_xpath('//your/xpath')
first_element = elements[0]   # 获取第一个匹配元素

请注意,如果没有找到匹配的元素,find_elements_* 方法将返回一个空列表。因此,在尝试访问索引 0 之前,请确保该列表至少具有一个元素。

另外,如果您只需要获取第一个匹配元素而不是所有匹配元素,则可以使用 find_element_* 方法来定位它。例如,要通过 XPath 找到页面上第一个匹配元素,可以使用以下示例代码:

python复制代码
element = driver.find_element_by_xpath('//your/xpath')

与 find_elements_* 方法不同,find_element_* 方法将只返回第一个匹配项。如果没有找到任何匹配项,则会抛出 NoSuchElementException 异常。

例子如下:

  • 需要获取到动态的id实例。步骤如下
  • f12模式下找到该组件的相关元素
  • windows下可以使用ctrl+f调出元素调试
  • 使用contains函数获取到该组件的元素定位
  • 当使用contains函数获取到多个匹配元素,需要获取第一个则可以使用[0]这个来定位到需要获取的是第一个元素

image.png

image.png

image.png

如果您使用 find_elements_* 方法在 Selenium 中找到多个匹配元素,则可以按照以下方式获取第一个匹配元素:

elements = driver.find_elements_by_xpath('//your/xpath')
first_element = elements[0]   # 获取第一个匹配元素

请注意,如果没有找到匹配的元素,find_elements_* 方法将返回一个空列表。因此,在尝试访问索引 0 之前,请确保该列表至少具有一个元素。

另外,如果您只需要获取第一个匹配元素而不是所有匹配元素,则可以使用 find_element_* 方法来定位它。例如,要通过 XPath 找到页面上第一个匹配元素,可以使用以下示例代码:

element = driver.find_element_by_xpath('//your/xpath')

与 find_elements_* 方法不同,find_element_* 方法将只返回第一个匹配项。如果没有找到任何匹配项,则会抛出 NoSuchElementException 异常。

二、selenium的定位方式

  1. 根据id定位元素,使用find_element_by_id()方法,需要传入元素的id属性值
  2. 根据name定位元素,使用find_element_by_name()方法,需要传入元素的name属性值
  3. 根据class name定位元素,使用find_element_by_class_name()方法,需要传入元素的class属性值
  4. 根据 tag name 定位元素:使用 find_element_by_tag_name()  方法,需要传入元素的标签名
  5. 根据链接文本或链接地址定位元素:使用 find_element_by_link_text()等方法,需要传入链接文本或部分链接文本。
  6. 根据 XPath 表达式定位元素:使用 find_element_by_xpath()等方法,需要传入合法的 XPath 表达式。xpath定位时可以****通过文本内容来进行定位元素使用text()函数[//span[text()="example]
  7. 根据 CSS 选择器定位元素使用 find_element_by_css_selector()等方法,需要传入合法的 CSS 选择器。

以上这些定位方式都可以返回单个匹配的元素或多个匹配的元素列表。

python3.8使用find_element_by_**的方法会出现横线,执行时也会出现‘DeprecationWarning’的警告。股python3.8以上的都使用find_elements()方法。如id定位:``` find_element(By.ID, "mobile")

***有时候不是元素定位出问题而报错,而是因为没有加上等待