两个输入框具有完全相同的属性。如何使用唯一的xpath?

时间:2018-07-12 02:24:49

标签: selenium-webdriver

https://www.phptravels.net有两个具有相同名称和属性的输入框(输入City或Airport)。因此,我的xpath导致“无此元素”异常。有没有解决的办法。请帮忙!以下是代码:

 package com.php.travels;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;


public class Booking {

public static void main(String[] args) {
   System.setProperty("webdriver.chrome.driver", 
   "/Users/owner/desktop/chromedriver");

    WebDriver driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    driver.get("https://www.phptravels.net");
    driver.findElement(By.xpath("//span[text()='Flights']")).click();

    driver.findElement(By.xpath("//*[@id='select2- 
    drop']/div/input")).sendKeys("LAX");

   }

}

3 个答案:

答案 0 :(得分:0)

问题不在于两个元素具有相同的ID。

当您单击文本字段时,标识将被更改。这意味着您每次只会找到单个输入元素。您不必担心它们是否具有相同的ID。

在找到输入元素之前,您必须单击文本字段。请参阅下面的代码。

driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.get("https://www.phptravels.net");
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[text()='Flights']")));
element.click();

driver.findElement(By.xpath("//*[@id='s2id_location_from']")).click();
driver.findElement(By.xpath("//*[@id='select2-drop']/div/input")).sendKeys("LAX");
element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@class='select2-results']//li[contains(.,'LAX')]")));
element.click();

driver.findElement(By.xpath("//*[@id='s2id_location_to']")).click();
driver.findElement(By.xpath("//*[@id='select2-drop']/div/input")).sendKeys("DMK");
element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@class='select2-results']//li[contains(.,'DMK')]")));
element.click();

答案 1 :(得分:0)

两个输入框都有不同的名称

<input type="text" name="" id="location_from" tabindex="-1" class="select2-offscreen">
<input type="text" name="" id="location_to" tabindex="-1" class="select2-offscreen">

因此,您可以为第一个和第二个输入框使用以下CSS选择器

对于第一个输入框:input#location_from.select2-offscreen

对于第二个输入框:input#location_to.select2-offscreen

我已经尝试过这两个定位器,并且它们都工作正常。

答案 2 :(得分:0)

只有当您可以获得准确的定位器时,定位器才会出现问题,那么就不会有问题:

 package com.php.travels;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;


public class Booking {

public static void main(String[] args) {
   System.setProperty("webdriver.chrome.driver", 
   "/Users/owner/desktop/chromedriver");

        WebDriver driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
        driver.get("https://www.phptravels.net");
        driver.findElement(By.xpath("//span[@class='hidden-xs' and contains(text(),'Flights')]")).click();
        driver.findElement(By.xpath("//span[@class='select2-chosen' and contains(text(),'Enter City Or Airport')]")).click();

        driver.findElement(By.xpath("//div[@class='select2-drop-mask']/following-sibling::div//input[contains(@class,'select2-input')]")).sendKeys("LAX");
   }

}