Selenium中CSS Locator是编写脚本的最重要方面之一。 如果您无法通过使用Selenium中的任何CSS定位器来定位元素,那么精通Selenium自动化将是一项艰巨的任务。 Selenium提供多种定位元素的方法。
您可以查看有关Selenium中不同CSS定位器的其他文章,这些文章可通过多种方式帮助您定位元素:
如果您是Selenium Java的高级或中级实践者,那么可以喜欢上面提到的专门文章。 我写了完整的指南来帮助您说明Selenium中CSS定位器的实际演示。
查看Selenium WebDriver中每个CSS定位器的完整指南,并附带示例
在本Selenium Java教程中,我将参考Selenium中的类名定位器,以演示如何通过类名在网页上定位元素。
Selenium中的类名定位器入门与示例
为了在Selenium中使用类名定位器,我们需要使用以下语法:findElement(By.className("_up0kwni "))
现在,让我们看一下在定位器中按“类名”查找元素的代码:
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class ClassNameLocator {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.setProperty("webdriver.chrome.driver", ".\\ChromeDriver\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.manage().window().maximize();
//Opening the air bnb home page
driver.get("https://www.airbnb.co.in/");
//Locating location field for the search form via class name
driver.findElement(By.className("_up0kwni")).sendKeys("Goa", Keys.ENTER);
//Locating check-in field for the search form via class name
driver.findElement(By.className("_14fdu48d")).click();
//Locating the date 12th June for check-in field
driver.findElement(By.className("_1wh4xpp1")).click();
//closing the driver
driver.quit();
}
}
很简单,不是吗? 在本Java Selenium教程的下一部分中,我们将学习如何处理Selenium中的类名定位器的常见异常。
Selenium中类名定位器的最常见异常之一
在Selenium中使用类名称定位器时,您可能会遇到的另一个有趣的事实和一个普遍的错误是:
我敢肯定,您可能遇到了此错误。 让我们尝试在Facebook注册页面的以下代码片段中纳入此方案。 以下是Facebook“名字”字段的DOM结构,其类别名称属性在下面突出显示:
引用的代码段,尝试使用Selenium中的类名称定位器访问名字字段:
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class ClassNameLocator {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
System.setProperty("webdriver.chrome.driver", ".\\ChromeDriver\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.manage().window().maximize();
//Opening the air bnb home page
driver.get("https://www.facebook.com/");
//Locating by firstname via class name
driver.findElement(By.className("inputtext _58mg _5dba _2ph-")).sendKeys("Sadhvi");
//closing the driver
driver.quit();
}
}
下面引用了控制台错误:
如何处理这个错误? 好吧,Selenium将此视为复合类,这意味着通过空格标记了多个类。 因此,任何带有空格的类名称都将被视为两个或三个或更多类。
在这种情况下,标记为“输入文本_58mg _5dba _2ph-”的此类名称包含三个空格,从而使其成为三个不同的类别。 因此, Selenium提到了错误,指出它无法一起找到多个类。 在这种情况下,您可以选择使用Selenium中的CSS选择器或使用Selenium中的XPath使用类名attribute来定位元素。 下面的参考代码段:
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class ClassNameLocator {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
System.setProperty("webdriver.chrome.driver", ".\\ChromeDriver\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.manage().window().maximize();
//Opening the facebook home page
driver.get("https://www.facebook.com/");
//Locating by firstname via class name
driver.findElement(By.xpath("//input[@class='inputtext _58mg _5dba _2ph-']")).sendKeys("Sadhvi");
//closing the driver
driver.quit();
}
}
当多个元素共享同一个类名时,如何定位一个元素?
现在,您知道何时使用类名以及何时不能使用类名。 但是,您有没有想过当多个元素共享同一个类名时的情况? 您如何应对这种情况? 这又是一回事,您只需使用findElements关键字即可实现。 您需要做的就是,使用findElements关键字找到具有该类名称的所有元素,然后通过索引遍历所需的元素类名称。 话虽如此,我宁愿建议您寻找替代该元素的替代方法。 由于其断裂的趋势会很高,并可能导致错误。
Selenium中具有相似类名的多个元素的类名定位器示例
让我们考虑下面的示例,重点介绍上面的场景。 在这种情况下,我们考虑使用LinkedIn注册页面,其中所有字段共享相同的类名。 在这种情况下,我们需要注意两个重要事项:
- 如果否,则定义索引,然后默认情况下selenium会选择该类名称遇到的第一个元素。 在下面的代码段中,它将找到第一个元素,即名字:
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class ClassNameLocator {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
System.setProperty("webdriver.chrome.driver", ".\\ChromeDriver\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.manage().window().maximize();
//Opening the linkedin sign up home page
driver.get("https://www.linkedin.com/start/join");
//Locating by firstname via class name
driver.findElement(By.className("cell-body-textinput")).sendKeys("Sadhvi");
//closing the driver
driver.quit();
}
}
注意:请查看类名称,在本例中为cell-body-textinput,因为它没有标记空格,因此被视为单个类。
- 使用索引查找具有相同类名的不同元素。 下面的参考代码段:
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class ClassNameLocator {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
System.setProperty("webdriver.chrome.driver", ".\\ChromeDriver\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.manage().window().maximize();
//Opening the air bnb home page
driver.get("https://www.linkedin.com/start/join");
//Locating by firstname via class name
List<webelement> signUpForm=driver.findElements(By.className("cell-body-textinput"));
//finding the number of elments with the same class name
int size=signUpForm.size();
System.out.print(size);
//locating the first name locator
signUpForm.get(0).sendKeys("Sadhvi");
//locating the last name locator
signUpForm.get(1).sendKeys("Singh");
//locating the email locator
signUpForm.get(2).sendKeys("sadhvisingh24@gmail.com");
//locating the password locator
signUpForm.get(3).sendKeys("password");
//closing the driver
//driver.quit();
}
}
</webelement>
控制台输出:
宾果,你现在走了。 这都是关于Selenium中的类名定位器的。
我们从Selenium中学到了什么名字?
好了,这就是今天针对Selenium中CSS定位器的Selenium Java教程的全部内容。 我相信到目前为止,您已经对如何有效使用Selenium中的类名定位器有了深入的了解。 我们在Selenium中实现类名定位器时遇到了最常见的错误。 我们还学习了如何克服多个元素共享相似类名的复杂情况。 Adios,测试愉快!
翻译自: https://www.javacodegeeks.com/2019/06/selenium-java-tutorial-class-name-locator-selenium.html