如何通过除“class”和“name”之外的属性直接查找WebElements(例如“title”)

问题描述 投票:2回答:5

我是Java和Selenium的新手,所以如果我的问题听起来有些重要,我会提前道歉。

我用:

driverChrome.findElements(By.className("blabla"));

查找具有“blabla”作为其className的元素,例如:

<span class="blabla" title="the title">...</span>

现在,如果我想通过其他属性查找所有元素,该怎么办?就像是:

driverChrome.findElements(By.titleValue("the title"));

这是我目前用来执行此任务的代码:

List<WebElement> spans = driverChrome.findElements(By.tagName("span"));

for (WebElement we : spans) {

    if (we.getAttribute("title") != null) {
            if (we.getAttribute("title").equals("the title")) {
                    ...
                    break;
            }
    }

}

但它并不快速且易于使用。

java selenium testing selenium-webdriver selenium-chromedriver
5个回答
6
投票

通过XPath归档元素时有很多方法

1 Absolutely path

<html>
  <body>
     <div>
       <form>
          <input id="demo"/>
       </form>
     </div>
   </body>
 <html>

获取“输入”标签

xpath="/html/body/div/form/input"

2 Relative path

<html>
  <body>
     <div>
       <form>
          <input id="demo"/>
       </form>
     </div>
   </body>
 <html>

获取“输入”标签

xpath="//input"  

3 Index

<html>
  <body>
     <div>
       <form>
          <input id="demo1"/>
          <input id="demo2"> 
       </form>
     </div>
   </body>
 <html>

获取输入'demo2'

的xpath = “//输入[1]”

4 Arbitrary single attribute

<html>
  <body>
     <div>
       <form>
          <input id="demo1"/>
          <input id="demo2" foo="bar"> 
       </form>
     </div>
   </body>
 <html>

获取输入'demo2'

xpath="//input[@id='demo2']" (equivalent to By.id)

要么

xpath="//input[@foo='bar']"

5 Arbitrary multiple attributes

<html>
    <body>
     <div>
       <form>
          <input id="1" type="submit" />
          <input id="2" foo="bar"/>
          <input id="3" type="submit" foo="bar"/> 
       </form>
     </div>
   </body>
 <html>

获得第三个输入

xpath="//input[@type='submit'][@foo='bar']"

要么

xpath="//input[@type='submit' and @foo='bar']"

如果使用xpath =“// input [@ type ='submit'或@ foo ='bar']”,那么你将获得一个数组。您可以通过driver.findElements(By.xpath(xpath))(java)获取List。否则你将获得第一个元素(如果你只使用driver.findElement)。因为所有3个输入元素都符合你的条件'或',它给你第一个。

6 Contains attribute

<html>
    <body>
     <div>
       <form>
          <input id="1" type="submit" />
          <input id="2" foo="bar" daddy="dog"/>
          <input id="3" type="submit" foo="bar"/> 
       </form>
     </div>
   </body>
 <html>

获得第二个输入

xpath="//input[@daddy]"

因为只有第二个属性'爸爸'

7 Inner searching

 <html>
    <body>
     <div>
       <form>
          <input id="input1" daddy="dog" />
          <input id="input2" daddy="pig"/>
       </form>
     </div>
     <div>
       <form>
          <input id="input3" daddy="dog" />
          <input id="input4" daddy="apple"/>
       </form>
     </div>
   </body>
 <html>

获得第二个div

xpath="//div[.//input[@daddy='dog'] and .//input[@daddy='apple']]"

总的来说,这些都是我现在可以解决的问题。希望能帮助到你。


0
投票

你可以使用xpath做到这一点

driverChrome.findElement(By.xpath("//*[@yourAttribute='value']"));

例如:

driverChrome.findElement(By.xpath("//*[@title='the title']"));

0
投票

您也可以使用CSS定位器实现此目的。

By.cssSelector(“span [title ='the title']”)

传言CSS选择器更快。

我们在Selenium WebDriver in Practice中介绍了许多定位技术:http://selenium-webdriver-in-practice.github.io


0
投票

您可以选择多种选择。

  1. 通过css选择器
  2. 通过xpath
  3. 通过id
  4. 标签为方便阅读教程,请点击以下链接:http://www.w3schools.com/xsl/xpath_syntax.asp http://www.w3schools.com/cssref/css_selectors.asp

以上都是使用元素属性,或者,您可以使用元素之间的关系。如兄弟姐妹,父母和孩子。

有关详细信息,请参阅此精彩链接。 http://scraping.pro/res/xpath-cheat/xpath_css_dom_recipes.pdf

您也可以使用非常好的支持和建立的框架。例如,机器人框架,它将极大地简化您的代码。

http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html


0
投票
 WebElement element = driver.findElement(By.xpath(".//*[@id='ctl00_PLSMainContent_AssistTaskList_assistListView']/div/table/tbody/tr/td[7]/span"));

 System.out.println("get attribute is --> " + element.getAttribute("Title"));
© www.soinside.com 2019 - 2024. All rights reserved.