如何使用 Selenium 和 Java 从非选择下拉列表中单击并选择一个选项

Posted

技术标签:

【中文标题】如何使用 Selenium 和 Java 从非选择下拉列表中单击并选择一个选项【英文标题】:How to click and select an option from a non select dropdown using Selenium and Java 【发布时间】:2021-04-19 15:22:51 【问题描述】:

我正在使用 Selenium 开始自动化,这是我第一次单独做,我在这里找不到下拉列表的正确代码https://demoqa.com/automation-practice-form 最后有一个“州和城市列表”。对于州,您必须单击“选择州”,然后它会为您提供选项,因此您必须单击所需的选项。

这是我的代码,我尝试了不同的选项,但这是最接近正确运行代码的选项(但它仍然没有做需要做的事情) 我知道它不能用 Select 来完成,因为它是一个 div,我只能使用:

driver.findElement()

代码试验:

//Select state and city
driver.findElement(By.id("state")).click();     
driver.findElement(By.xpath("//body/div/div/div/div/div/div/form/div[10]/div[2]/div[1]/div[1]/div[1]/div[1]")).click();

图片A: enter image description here

图片 B:

图片 C: enter image description here

【问题讨论】:

是否有明确的错误或只是无法正常工作? 您可能需要在查找下拉元素之前添加等待,因为它会动态添加到 dom 中 您好!不,它没有给我一个明确的错误,它可以工作,但它没有保持选中状态。是的,我会在等待的情况下尝试这样做。谢谢! 【参考方案1】:
driver.get("https://demoqa.com/automation-practice-form");
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("react-select-3-input")))).sendKeys("NCR");

【讨论】:

欢迎来到 Stack Overflow。请阅读How to Answer。带有解释的代码总是更有帮助。【参考方案2】:

感谢那些花时间帮助我的人.. 我找到了解决方案!也许还有另一种方式,但这是我找到的方式,因为这是我第一次编写代码,我真的很高兴。 我所做的是一步一步地走,直到我找到“输入”,所以我使用 sendKeys.(keys.Enter);因为它不适用于 .click();

后来我意识到只有 .................... ..................... state.sendKeys("NCR") ... state.sendKeys(Keys.ENTER);

也可以工作...所以..代码很简单..

公共无效选择状态和城市() WebDriverWait 等待 = new WebDriverWait(driver, 20);

    wait.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.xpath("//div[contains(text(),'Select State')]"))));
    wait.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.cssSelector("#state > div"))));
    driver.findElement(By.xpath("//div[@id='state']//div[@class='css-1g6gooi']"));
    driver.findElement(By.xpath("//body/div[@id='app']/div/div/div/div/div/form[@id='userForm']/div[@id='stateCity-wrapper']/div/div[@id='state']/div/div/div/div[1]"));
    state.sendKeys("NCR");
    state.sendKeys(Keys.ENTER);
    
    driver.findElement(By.xpath("//div[contains(text(),'Select City')]"));
    driver.findElement(By.xpath("//body//div[@id='app']//div[@id='city']//div//div//div[2]"));
    driver.findElement(By.xpath("//body/div[@id='app']/div/div/div/div/div/form[@id='userForm']/div[@id='stateCity-wrapper']/div/div[@id='city']/div/div/div/div[1]"));
    city.sendKeys("Delhi");
    city.sendKeys(Keys.ENTER);

【讨论】:

【参考方案3】:

drop-down-menu 不是html-select 元素。要从 State 下拉列表中选择一个项目,您需要为elementToBeClickable() 诱导WebDriverWait,您可以使用以下Locator Strategies:

driver.get("https://demoqa.com/automation-practice-form");
((javascriptExecutor)driver).executeScript("return arguments[0].scrollIntoView(true);", new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("div#state div[class$='placeholder']"))));
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("div#state div[class$='placeholder']"))).click();
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(., 'Uttar Pradesh')]"))).click();

参考

您可以在以下位置找到一些相关的详细讨论:

Automating jQuery based bootstrap dropdown using Selenium and Java I would like to select a DropDown from a list but HTML don't have select Tag I am not sure should i use Select class or what

【讨论】:

您好!它没有按照它应该做的方式工作,因为它没有给出任何错误,但同时它没有做它应该做的事情..选择没有保持选中.. @NatachaVergara 很高兴能为您提供帮助。 Vote up questions and answers 您发现这对未来读者的利益很有帮助。见Why is voting important。

以上是关于如何使用 Selenium 和 Java 从非选择下拉列表中单击并选择一个选项的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Selenium WebDriver 和 java 从下拉列表中选择一个项目?

如何使用Java在Selenium WebDriver中按类名选择下拉值[重复]

如何在 Java 中使用 Selenium 选择这个元素?

如何使用 Selenium WebDriver、Java 通过文本选择 Web 元素

如何搭建selenium+java环境搭建

如何使用 Java 计算 Selenium WebDriver 中选择下拉框中的选项数量?