- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我将 findElements 方法与列表一起使用时,出现 NullPointerException。尝试使用 POM 模型也得到相同的错误。评论了代码的 findelements 部分并测试它工作正常。我不确定我的代码有什么问题。
代码中定义的警报未处理位置警报,未出现任何更改发现异常。
我的代码需要修复什么?
代码:
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
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;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
class CleartripPOM1 {
WebDriver driver;
private String url="https://www.cleartrip.com/";
public CleartripPOM1(WebDriver driver) {
this.driver=driver;
}
By from=By.xpath("//input[@title='Any worldwide city or airport' and @etitle='From']");
By to=By.xpath("//input[@title='Any worldwide city or airport' and @etitle='To']");
By date=By.xpath("//input[@id='DepartDate']");
By adults=By.id("Adults");
By childerns=By.cssSelector("select[name='childs'][id='Childrens']" );
By infants=By.name("infants");
By search=By.xpath("//input[@id='SearchBtn']");
By airline=By.xpath("//li[@class='vendor']/a");
By depart=By.xpath("//li[@class='depart']/a");
By duration=By.xpath("//li[@class='duration']/a");
By price=By.xpath("//li[@class='price']/a");
private List <WebElement>coupon =driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/td/span"));
private List <WebElement> airName=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th/small"));
private List <WebElement> departure=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='depart']"));
private List <WebElement> arrival=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='arrive']"));
private List <WebElement> travelTime=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='duration']"));
private List <WebElement> ticketFare=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='price']"));
public ArrayList<String> airlineNames(List<WebElement>el) {
ArrayList<String> names= new ArrayList<String>();
for(WebElement e:el) {
names.add(e.getText());
}
return names;
}
public void url_launch() {
driver.get(url);
driver.manage().window().maximize();
// WebDriverWait wait= new WebDriverWait(driver,20);
// wait.until(ExpectedConditions.alertIsPresent());
// Alert alert = driver.switchTo().alert();
// alert.dismiss();
}
public void actions(By e, String location) {
Actions act = new Actions(driver);
Action action= act.click(driver.findElement(e)).sendKeys(location).build();
action.perform();
}
public void selection(By e,String selection) {
Select select = new Select(driver.findElement(e));
select.selectByValue(selection);
}
public void searchFlights() {
actions(from,"Chennai");
actions(to,"Madurai");
actions(date,"25/08/2018");
driver.findElement(date).sendKeys(Keys.TAB);
selection(adults,"2");
selection(childerns,"3");
selection(infants,"1");
driver.findElement(search).click();
WebDriverWait wait= new WebDriverWait(driver,20);
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//li[@class='vendor']/a")));
System.out.println(airlineNames(coupon));
System.out.println(airlineNames(airName));
System.out.println(airlineNames(departure));
System.out.println(airlineNames(arrival));
System.out.println(airlineNames(travelTime));
System.out.println(airlineNames(ticketFare));
运行代码:
public class TestRunner {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
// TODO Auto-generated method stub
CleartripPOM1 ct= new CleartripPOM1(driver);
ct.url_launch();
ct.searchFlights();
}
}
最佳答案
#1:您在初始化 driver
变量之前初始化所有实例 Web 元素,因此它会抛出 NullPointerException
。实例 Web 元素初始化需要移至构造函数内,否则需要移至需要该特定元素的方法内。
我给出了两种带有两个元素示例的方法。请使用以下任一方法更改所有实例元素初始化。
例如:
方法一:在构造函数中初始化实例WebElement。这样,所有WebElement都可以在类中的所有方法中访问。
WebDriver driver;
private List <WebElement>coupon;
private List <WebElement> airName;
private String url="https://www.cleartrip.com/";
public CleartripPOM1(WebDriver driver) {
this.driver=driver;
coupon=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/td/span"));
airName=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th/small"));
-----------
----------- and so on
}
方法 2: 仅在需要的方法内初始化 WebElement 实例。假设您只想在某个方法中访问优惠券和航空名称元素列表,那么您可以单独在该特定方法中进行初始化
WebDriver driver;
private List <WebElement>coupon;
private List <WebElement> airName;
private String url="https://www.cleartrip.com/";
public CleartripPOM1(WebDriver driver) {
this.driver=driver;
}
public void travelDetails(){
coupon=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/td/span"));
airName=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th/small"));
-----------
----------- and so on
}
#2 关于警报,您将收到 chrome 特定通知。因此,您需要在驱动程序初始化部分禁用通知选项,如下所示
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-notifications");
WebDriver driver=new ChromeDriver(options);
编辑:
解决后续问题:
仅执行搜索操作后,您将获得结果部分,并且从结果部分中识别出所有列表 WebElement。因此,您需要在执行搜索操作后初始化所有列表 WebElement,如下所示。
关于Web元素声明,如果您想在不同的方法中访问相同的WebElement,那么您可以将WebElement声明为实例。如果List WebElement范围仅在searchFlights方法中,那么我建议在searchFlights 方法而不是实例声明。
搜索方法需要更改:
public void searchFlights() {
actions(from,"Chennai");
actions(to,"Madurai");
actions(date,"25/08/2018");
driver.findElement(date).sendKeys(Keys.TAB);
selection(adults,"2");
selection(childerns,"3");
selection(infants,"1");
driver.findElement(search).click();
WebDriverWait wait= new WebDriverWait(driver,20);
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//li[@class='vendor']/a")));
coupon =driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/td/span"));
airName=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th/small"));
departure=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='depart']"));
arrival=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='arrive']"));
travelTime=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='duration']"));
ticketFare=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='price']"));
System.out.println(airlineNames(coupon));
System.out.println(airlineNames(airName));
System.out.println(airlineNames(departure));
System.out.println(airlineNames(arrival));
System.out.println(airlineNames(travelTime));
System.out.println(airlineNames(ticketFare));
}
关于java - 在 Selenium 中使用 findElements 的 NullpointerException 和 alter 未处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51106678/
Selenium IDE、Selenium RC 和 Selenium WebDriver 有什么区别;我们可以在什么样的项目中使用它们?任何建议将不胜感激。 最佳答案 Selenium IDE 是一
我的 Selenium 服务器在远程服务器上运行。我从我的本地 PC 启动我的 Selenium 脚本,它从网站获取数据。 例如,我的 Selenium 脚本执行这段 JS 代码: JSON.stri
Selenium 中“//div[.//a[text()='SELENIUM']]”和“//div[//a[text()='SELENIUM']]”有什么区别xpath。 有人可以澄清我在 xpath
我正在创建自动冒烟测试。我读到在单元测试中使用多个断言不是一个好的做法,这条规则是否也适用于使用 selenium 的 webdriver 测试? 在我的冒烟测试中,有时我会使用 20 多个断言来验证
我在一个变量中存储了一个值,在另一个变量中存储了第二个值,现在我想将这两个数字相加。我无法做到这一点,我尝试过下面的代码,但它不起作用 store 6 w sto
Selenium 中的回车键和回车键有什么区别? This related SO answer并且提供的链接说明它们是不同的。我还注意到,在使用 Firefox 24.2 时,回车键将发送一个 HTM
以下是我遇到异常的详细信息: 当我使用以下命令启动节点时,出现如下错误: F:\SeleniumGrid\Jars>java -jar selenium-server-standalone-3.0.0
我是 的新手 Selenium 我对版本号有点困惑。 Selenium 2.0 2011年发布。我刚刚下载了 Selenium IDE Firefox 扩展,版本为 1.7.2 .是否还有 IDE 的
我正在使用 Selenium 运行Codeception 2。我可以看到 Selenium 打开了浏览器并运行了测试。然后,我从代码接收中得到一个错误,即存在失败的断言。 我知道有一个HTML文件可以
Closed. This question needs to be more focused。它当前不接受答案。 想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。
我想关闭弹出窗口(已知的窗口名称),然后返回到原始窗口。 我该怎么办? 如果我无法获得窗口中关闭按钮的常量。那么有没有达到目标的一般行为? 最佳答案 你有没有尝试过: selenium.Close()
我正在用webdriver做一个测试机器人。我有一个场景,它单击一个按钮,打开一个新窗口,并且它通过特定的xpath搜索元素,但是有时没有这样的元素,因为可以将其禁用,并且出现此错误:org.open
我是第一次使用Selenium,对这些选项不知所措。我在Firefox中使用IDE。 当我的页面加载时,它随后通过JSONP请求获取值,并在其中填充选择中的选项。 我如何让Selenium等待选择中的
我开始使用nightwatch.js编写e2e测试,我注意到我想在目标浏览器的控制台(开发人员工具)中手动检查一些错误。但总是在我打开开发者控制台时,浏览器会自动关闭它。这是selenium还是nig
我正在尝试使用以下方式刮除Glassdoor的评论: https://github.com/MatthewChatham/glassdoor-review-scraper 但是我得到了错误并且不知道如
背景 我设置了一个Selenium Grid项目,以在两种不同的浏览器Chrome和Firefox中执行测试。我正在使用Gradle执行测试。该测试将成功执行两次,一次按预期在Chrome中执行,一次
当测试失败时,运行 selenium 测试的浏览器将关闭。这在尝试调试时没有帮助。我知道我可以在失败时选择屏幕截图,但如果没有整个上下文,这并没有帮助。在浏览器仍然可用的情况下,我可以回击并检查发生了
使用 Selenium Web 驱动程序而不是 Selenium RC 启动新的测试框架是个好主意吗?对于 Selenium Web 驱动程序,并非所有 Selenium 方法都已实现。那么使用 Se
我使用 selenium 页面对象模型来定义所有页面元素。我对元素命名所遵循的命名约定不太相信,并且感觉太长了。请对此提出建议。 @FindBy(xpath = "//tbody[@id='tabvi
有一个带有按钮的 html 页面,我的 Selenium 测试正在测试,当单击按钮时,会执行一个操作。 问题是,看起来点击发生在 javascript 执行之前 - 在处理程序绑定(bind)到页面之
我是一名优秀的程序员,十分优秀!