org.openqa.selenium.support.ui.UnexpectedTagNameException:元素应该是“选择”的,但是在选择下拉值时是“跨度的”

时间:2019-06-06 04:45:26

标签: java selenium selenium-webdriver webdriver webdriverwait

在这里,我试图使用Selenium脚本从下拉列表中选择一个值,但在控制台中却出现了此错误,例如

  

“线程“主”中的异常” org.openqa.selenium.support.ui.UnexpectedTagNameException:元素应已被“选择”,但已被“跨度”。

<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

下拉菜单中有多个值,我需要在其中选择一个值。

2 个答案:

答案 0 :(得分:3)

错误显示您正在使用<span>标签而不是Select

您要查找的Select元素是//*[@id="signup-username"]

此外,您应该使用WebDriverWait等待定位符:

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));

您应该看着ExpectedConditions等待...

希望这对您有帮助!

答案 1 :(得分:-1)

@MosheSlavin的分析和回答是正确的方向。

此错误消息...

"Exception in thread "main" org.openqa.selenium.support.ui.UnexpectedTagNameException: Element should have been "select" but was "span"

...表示您已使用Select类与所需元素进行交互,因为该元素是<span>

要选择一个值,例如使用Selenium从下拉菜单中的用户名,您可以使用以下解决方案:

  • 代码块:

    driver.get("https://ecabportal.azurewebsites.net/dashboard");
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.name("email"))).sendKeys("admin@malbork.in");
    driver.findElement(By.name("password")).sendKeys("NsSaNj@0205");
    driver.findElement(By.name("signIn")).click();
    new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//h1[contains(., 'Dashboard')]")));
    driver.get("https://ecabportal.azurewebsites.net/user");
    new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@id='load']")));
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("span.select2-selection.select2-selection--single>span.select2-selection__rendered"))).click();
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[@class='select2-results']//li[contains(., 'User Name')]"))).click();
    
  • 浏览器快照:

UserName


注意:

    当页面更改(即DOM更改)时,在尝试使用elementToBeClickable()方法之前,
  • 始终为click()引发 WebDriverWait
  • 在此特定用例中,当您浏览到所需页面时,需要为invisibilityOfElementLocated()引入 WebDriverWait 的覆盖,然后调用所需的click()