0


Selenium 定位策略

定位策略

在DOM中标识一个或多个特定元素的方法.

定位器是在页面上标识元素的一种方法。它是传送给 查找元素方法的参数。

查看 鼓励测试练习 寻找 定位器的小技巧, 包含在查找方法中,不同时间,不同原因下,单独声明的定位器的使用方法。

元素选择策略

在 WebDriver 中有 8 种不同的内置元素定位策略:
定位器 Locator描述class name定位class属性与搜索值匹配的元素(不允许使用复合类名)css selector定位 CSS 选择器匹配的元素id定位 id 属性与搜索值匹配的元素name定位 name 属性与搜索值匹配的元素link text定位link text可视文本与搜索值完全匹配的锚元素partial link text定位link text可视文本部分与搜索值部分匹配的锚点元素。如果匹配多个元素,则只选择第一个元素。tag name定位标签名称与搜索值匹配的元素xpath定位与 XPath 表达式匹配的元素

创建定位器

要使用Selenium处理web元素,我们需要首先在网页上找到它。Selenium为我们提供了上述方法,使用这些方法我们可以在页面上定位元素。为了理解和创建定位器,我们将使用以下HTML片段。

<html>
<body>
<style>
.information {
  background-color: white;
  color: black;
  padding: 10px;
}
</style>
<h2>Contact Selenium</h2>

<form action="/action_page.php">
  <input type="radio" name="gender" value="m" />Male &nbsp;
  <input type="radio" name="gender" value="f" />Female <br>
  <br>
  <label for="fname">First name:</label><br>
  <input class="information" type="text" id="fname" name="fname" value="Jane"><br><br>
  <label for="lname">Last name:</label><br>
  <input class="information" type="text" id="lname" name="lname" value="Doe"><br><br>
  <label for="newsletter">Newsletter:</label>
  <input type="checkbox" name="newsletter" value="1" /><br><br>
  <input type="submit" value="Submit">
</form> 

<p>To know more about Selenium, visit the official page 
<a href ="www.selenium.dev">Selenium Official Page</a> 
</p>

</body>
</html>

class name

HTML页面web元素可以具有属性类。我们可以在上面显示的HTML片段中看到一个示例。我们可以使用Selenium中提供的类名定位器来识别这些元素。

    driver = webdriver.Chrome()
    driver.find_element(By.CLASS_NAME, "information")
  

css selector

CSS是用于设计HTML页面样式的语言。我们可以使用css选择器定位器策略来识别页面上的元素。如果元素有一个id,我们将定位器创建为css=#id。否则,我们遵循的格式是css=[属性=值]。让我们看看上面HTML片段中的一个例子。我们将使用css为“名字”文本框创建定位器。

    driver = webdriver.Chrome()
    driver.find_element(By.CSS_SELECTOR, "#fname")
  

id

我们可以使用网页中元素的ID属性来定位它。通常,ID属性对于网页上的元素应该是唯一的。我们将使用它来识别姓氏字段。

​​​​​​​

    driver = webdriver.Chrome()
    driver.find_element(By.ID, "lname")
  

name

我们可以使用网页中元素的NAME属性来定位它。通常,NAME属性对于网页上的元素应该是唯一的。我们将使用它来识别“时事通讯”复选框。

​​​​​​​

    driver = webdriver.Chrome()
    driver.find_element(By.NAME, "newsletter")
  

link text

如果我们想要定位的元素是链接,我们可以使用链接文本定位器在网页上识别它。链接文本是链接显示的文本。在共享的HTML片段中,我们有一个可用的链接,让我们看看如何定位它。
​​​​​​​

    driver = webdriver.Chrome()
    driver.find_element(By.LINK_TEXT, "Selenium Official Page")
  

partial link text

如果我们想要定位的元素是链接,我们可以使用部分链接文本定位器在网页上识别它。链接文本是链接显示的文本。我们可以将部分文本作为值传递。在共享的HTML片段中,我们有一个可用的链接,让我们看看如何定位它。​​​​​​​​​​​​​​

    driver = webdriver.Chrome()
    driver.find_element(By.PARTIAL_LINK_TEXT, "Official Page")
  

tag name

我们可以使用HTML标签本身作为定位器来识别页面上的web元素。从上面共享的HTML片段中,让我们使用其HTML标记“a”来识别链接。​​​​​​​​​​​​​​

    driver = webdriver.Chrome()
    driver.find_element(By.TAG_NAME, "a")
  

xpath

HTML文档可以被视为XML文档,然后我们可以使用xpath,这将是到达感兴趣的元素以定位该元素所经过的路径。XPath可以是绝对的XPath,它是从文档的根创建的。示例-/html/form/input[1]。这将返回阳式单选按钮。或者xpath可以是相对的。示例-//input[@name='name']。这将返回名字文本框。让我们使用xpath为女性单选按钮创建定位器。​​​​​​​​​​​​​

    driver = webdriver.Chrome()
    driver.find_element(By.XPATH, "//input[@value='f']")
  

查询网络元素

根据提供的定位值定位元素.

使用Selenium最基本的方面之一是获得要使用的元素引用。Selenium提供了许多内置的定位器策略来唯一地识别元素。有很多方法可以在非常高级的场景中使用定位器。出于本文档的目的,让我们考虑以下HTML片段:

<ol id="vegetables">
 <li class="potatoes">…
 <li class="onions">…
 <li class="tomatoes"><span>Tomato is a Vegetable</span>…
</ol>
<ul id="fruits">
  <li class="bananas">…
  <li class="apples">…
  <li class="tomatoes"><span>Tomato is a Fruit</span>…
</ul>

第一个匹配元素

许多定位器将匹配页面上的多个元素。奇异查找元素方法将返回对在给定上下文中找到的第一个元素的引用。

评估整个DOM

当在驱动程序实例上调用find元素方法时,它会返回对DOM中与所提供的定位器匹配的第一个元素的引用。此值可以存储并用于将来的元素操作。在上面的示例HTML中,有两个元素的类名为“番茄”,因此此方法将返回“蔬菜”列表中的元素。​​​​​​​​​​​​​​

评估DOM的子集

与其在整个DOM中找到唯一的定位器,不如将搜索范围缩小到另一个已定位元素的范围。在上面的例子中,有两个元素的类名为“tomatos”,而获取第二个元素的引用则更具挑战性。
一种解决方案是定位具有唯一属性的元素,该元素是所需元素的祖先,而不是不需要的元素的祖先。然后在该对象上调用find元素:​​​​​​​​​​​​​​​​​​​​​

优化定位器

嵌套查找可能不是最有效的定位策略,因为它需要向浏览器发出两个单独的命令。
为了稍微提高性能,我们可以使用CSS或XPath在一个命令中找到这个元素。请参阅我们鼓励的测试实践部分中的定位器策略建议。
对于本例,我们将使用CSS选择器:
​​​​​​​​

所有匹配元素

有几个用例需要获取对匹配定位器的所有元素的引用,而不仅仅是第一个。复数find元素方法返回元素引用的集合。如果没有匹配项,则返回一个空列表。在这种情况下,对所有水果和蔬菜列表项的引用将在集合中返回。

plants = driver.find_elements(By.TAG_NAME, "li")
  

获取元素

通常,您得到一个元素集合,但希望使用特定的元素,这意味着您需要迭代该集合并确定所需的元素。​​​​​​​

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()

    # Navigate to Url
driver.get("https://www.example.com")

    # Get all the elements available with tag name 'p'
elements = driver.find_elements(By.TAG_NAME, 'p')

for e in elements:
    print(e.text)
  

从元素中查找元素

它用于在父元素的上下文中查找匹配的子WebElement的列表。为了实现这一点,父WebElement与“findElements”链接以访问子元素​​​​​​​

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.example.com")

    # Get element with tag name 'div'
element = driver.find_element(By.TAG_NAME, 'div')

    # Get all the elements available with tag name 'p'
elements = element.find_elements(By.TAG_NAME, 'p')
for e in elements:
    print(e.text)
  

获取活动元素

它用于跟踪(或)查找在当前浏览上下文中具有焦点的DOM元素。​​​​​​​

  from selenium import webdriver
  from selenium.webdriver.common.by import By

  driver = webdriver.Chrome()
  driver.get("https://www.google.com")
  driver.find_element(By.CSS_SELECTOR, '[name="q"]').send_keys("webElement")

    # Get attribute of current active element
  attr = driver.switch_to.active_element.get_attribute("title")
  print(attr)
  
标签: selenium

本文转载自: https://blog.csdn.net/TalorSwfit20111208/article/details/131344098
版权归原作者 知识的宝藏 所有, 如有侵权,请联系我们删除。

“Selenium 定位策略”的评论:

还没有评论