如何使用 Selenium 从动态下拉列表中 select 一个选项?
How to select an option from a dynamic dropdown using Selenium?
我正在尝试从 Make my trip http://www.makemytrip.com/ 的字段中点击 select 城市的下拉值。但是获取 Stale 元素引用异常。 ID 在页面加载时发生变化。
试过以下代码:
driver.findElement(By.xpath(".//*[@id='hp-widget__sfrom']")).clear();
driver.findElement(By.xpath(".//*[@id='ui-id-1']"));
driver.findElement(By.xpath(".//*[@id='hp-widget__sfrom']")).click();
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeSelected(driver.findElement(By.xpath(".//*[@class='ui-menu-item'][2]"))));
您可以使用此工作代码:
WebDriver driver = new ChromeDriver();
driver.get("https://www.makemytrip.com/");
driver.findElement(By.xpath(".//*[@id='hp-widget__sfrom']")).clear();
driver.findElement(By.xpath(".//*[@id='hp-widget__sfrom']")).click();
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@class='ui-menu-item'][2]/div/p[1]/span[1]"))).click();
我已经修复了下拉列表元素的 xPath。始终尝试指定您想要与之交互的确切元素。例如,如果你想点击按钮,尝试找到 <span>
或 <button>
标签,link <a>
标签和输入字段 <input>
标签。
您可以试试这个代码:
我没有看到在这种情况下使用 xpath。我已经将一些 xpath 转换为 css 选择器或 id. 并且只保留了一个。虽然我没有遇到过任何陈旧的元素参考。
System.setProperty("webdriver.chrome.driver", "D:\Automation\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 30);
driver.get("https://www.makemytrip.com/");
WebElement from = wait.until(ExpectedConditions.elementToBeClickable(By.id("hp-widget__sfrom")));
from.click();
from.clear();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("ul[class*='ui-widget-content hp-widget__sfrom']")));
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//li[contains(@aria-label,'Top Cities : Mumbai, India ')]"))).click();
单击下拉值,例如孟买您可以使用以下解决方案:
代码块:
driver.get("https://www.makemytrip.com/")
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@class='input_fromto checkSpecialCharacters ui-autocomplete-input' and @id='hp-widget__sfrom']"))).click();
List<WebElement> myList = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//li[@class='ui-menu-item'][starts-with(@id,'ui-id-')]//span[@class='autoCompleteItem__label']")));
for (WebElement element:myList)
if(element.getText().contains("Mumbai"));
element.click();
浏览器快照:
下面的代码对我来说工作得很好,它也被参数化了,它适用于任何输入值而不改变 xpath。在这个例子中,我以孟买作为测试数据。
driver.get("https://www.makemytrip.com/");
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
driver.findElement(By.xpath("//input[contains(@id,'hp-widget__sfrom')]")).clear();
driver.findElement(By.xpath("//input[contains(@id,'hp-widget__sfrom')]")).click();
driver.findElement(By.xpath("//input[contains(@id,'hp-widget__sfrom')]")).sendKeys("Mumbai");
Thread.sleep(2000);
WebDriverWait wait = new WebDriverWait(driver, 30);
By option = By.xpath("//div[@class='autoCompleteItem']/p/span[contains(text(),'Mumbai')]");
wait.until(ExpectedConditions.elementToBeClickable(option));
driver.findElement(option).click();
我正在尝试从 Make my trip http://www.makemytrip.com/ 的字段中点击 select 城市的下拉值。但是获取 Stale 元素引用异常。 ID 在页面加载时发生变化。 试过以下代码:
driver.findElement(By.xpath(".//*[@id='hp-widget__sfrom']")).clear();
driver.findElement(By.xpath(".//*[@id='ui-id-1']"));
driver.findElement(By.xpath(".//*[@id='hp-widget__sfrom']")).click();
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeSelected(driver.findElement(By.xpath(".//*[@class='ui-menu-item'][2]"))));
您可以使用此工作代码:
WebDriver driver = new ChromeDriver();
driver.get("https://www.makemytrip.com/");
driver.findElement(By.xpath(".//*[@id='hp-widget__sfrom']")).clear();
driver.findElement(By.xpath(".//*[@id='hp-widget__sfrom']")).click();
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@class='ui-menu-item'][2]/div/p[1]/span[1]"))).click();
我已经修复了下拉列表元素的 xPath。始终尝试指定您想要与之交互的确切元素。例如,如果你想点击按钮,尝试找到 <span>
或 <button>
标签,link <a>
标签和输入字段 <input>
标签。
您可以试试这个代码:
我没有看到在这种情况下使用 xpath。我已经将一些 xpath 转换为 css 选择器或 id. 并且只保留了一个。虽然我没有遇到过任何陈旧的元素参考。
System.setProperty("webdriver.chrome.driver", "D:\Automation\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 30);
driver.get("https://www.makemytrip.com/");
WebElement from = wait.until(ExpectedConditions.elementToBeClickable(By.id("hp-widget__sfrom")));
from.click();
from.clear();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("ul[class*='ui-widget-content hp-widget__sfrom']")));
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//li[contains(@aria-label,'Top Cities : Mumbai, India ')]"))).click();
单击下拉值,例如孟买您可以使用以下解决方案:
代码块:
driver.get("https://www.makemytrip.com/") new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@class='input_fromto checkSpecialCharacters ui-autocomplete-input' and @id='hp-widget__sfrom']"))).click(); List<WebElement> myList = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//li[@class='ui-menu-item'][starts-with(@id,'ui-id-')]//span[@class='autoCompleteItem__label']"))); for (WebElement element:myList) if(element.getText().contains("Mumbai")); element.click();
浏览器快照:
下面的代码对我来说工作得很好,它也被参数化了,它适用于任何输入值而不改变 xpath。在这个例子中,我以孟买作为测试数据。
driver.get("https://www.makemytrip.com/");
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
driver.findElement(By.xpath("//input[contains(@id,'hp-widget__sfrom')]")).clear();
driver.findElement(By.xpath("//input[contains(@id,'hp-widget__sfrom')]")).click();
driver.findElement(By.xpath("//input[contains(@id,'hp-widget__sfrom')]")).sendKeys("Mumbai");
Thread.sleep(2000);
WebDriverWait wait = new WebDriverWait(driver, 30);
By option = By.xpath("//div[@class='autoCompleteItem']/p/span[contains(text(),'Mumbai')]");
wait.until(ExpectedConditions.elementToBeClickable(option));
driver.findElement(option).click();