【问题标题】:I'm unable to locate/find xpath for the dropdown list in Selenium我无法在 Selenium 中找到/查找下拉列表的 xpath
【发布时间】:2018-07-08 04:51:54
【问题描述】:

我无法在 Selenium 中找到/找到下拉列表的 xpath,下拉列表是用 div 标签编写的,并且属性(aria-activedescendant)值在悬停时发生变化。一旦下拉列表中选择的值,属性(aria-activedescendant)值就会消失。

有谁能帮我找到 xpath 吗?提前致谢。

HTML如下:

<div class="DropdownWidget---dropdown_value DropdownWidget---placeholder"
id="189d67819beda8ebc9b5a2b7554f80f1_value" 
role="listbox" 
tabindex="0" 
aria-controls="189d67819beda8ebc9b5a2b7554f80f1_list" 
aria-expanded="false" 
aria-activedescendant="" 
aria-labelledby="189d67819beda8ebc9b5a2b7554f80f1" 
aria-describedby="189d67819beda8ebc9b5a2b7554f80f1_selectedChoice" 
aria-required="true">
<!-- react-text: 38 -->- Please Select a Value -<!-- /react-text -->
<span id="189d67819beda8ebc9b5a2b7554f80f1_selectedChoice" 
class="DropdownWidget---accessibilityhidden">- Please Select a Value -</span> 
</div>

鼠标悬停时属性的值如下变化:

aria-activedescendant=189d67819beda8ebc9b5a2b7554f80f1_list_0
aria-activedescendant=189d67819beda8ebc9b5a2b7554f80f1_list_1
aria-activedescendant=189d67819beda8ebc9b5a2b7554f80f1_list_2
aria-activedescendant=189d67819beda8ebc9b5a2b7554f80f1_list_3

下面是选项的检查代码:

<div class="DropdownWidget---dropdown_value DropdownWidget---placeholder" id="189d67819beda8ebc9b5a2b7554f80f1_value" role="listbox" tabindex="0" aria-controls="189d67819beda8ebc9b5a2b7554f80f1_list" aria-expanded="true" aria-activedescendant="189d67819beda8ebc9b5a2b7554f80f1_list_2"
  aria-labelledby="189d67819beda8ebc9b5a2b7554f80f1" aria-describedby="189d67819beda8ebc9b5a2b7554f80f1_selectedChoice" aria-required="true">
  <!-- react-text: 38 -->- Please Select a Value -
  <!-- /react-text --><span id="189d67819beda8ebc9b5a2b7554f80f1_selectedChoice" class="DropdownWidget---accessibilityhidden">- Please Select a Value -</span></div>
**Class used for dropdown selection**

public class Page2_ProjectType { 
WebDriver driver;
public Page2_ProjectType(WebDriver driver) {        
this.driver = driver;
}
public void MethodHome_ProjectType() throws InterruptedException {
Thread.sleep(5000);     
WebElement Btncreatenew = driver.findElement(By.xpath("//*[@id=\"appian-body\"]/div/div/div/div/div/div[2]/div/div[2]/div/div/div/div/div/div/div[1]/div/div[2]/div/a/img"));
Btncreatenew.click();
Thread.sleep(5000);
WebElement DDprojecttype = driver.findElement(By.id("189d67819beda8ebc9b5a2b7554f80f1_value"));
DDprojecttype.click();
String value = DDprojecttype.getAttribute("aria-activedescendant");
System.out.println(value);
List<WebElement> options = driver.findElements(By.cssSelector("div.DropdownWidget---dropdown_value.DropdownWidget---placeholder>span"));
for(WebElement element : options){
if(element.getText().equals("New Product Introduction")){
element.click();
}
}
}
}

【问题讨论】:

  • 为什么会有人关心由 JS 或任何其他编程语言动态生成的属性值。如果您想选择下拉值,我认为 aria-activedescendant 根本不重要。
  • @cruisepandey WebDriver 需要选择动态变化的值之一。下拉菜单中可用的选项与属性“aria-activedescendant”相关。你能建议任何其他方法来解决这个问题吗?
  • 您能否向我们展示您的代码并以 HTML 格式下拉值
  • 没有关于下拉选项的html代码,只有属性值在改变,导致span标签值也是如此。
  • 当您手动单击 please select a value 时,我可以看到正在填充 3 个选项。只需将鼠标悬停在这些选项上并检查元素并共享相同内容。

标签: java selenium selenium-webdriver xpath drop-down-menu


【解决方案1】:

css 选择器 将是:

div.DropdownWidget---dropdown_value.DropdownWidget---placeholder>span.DropdownWidget---accessibilityhidden

更新:

您的下拉菜单是使用 divspan 标签构建的。

代码你可以试试:

List<WebElement> options = driver.findElements(by.cssSelector("div.DropdownWidget---dropdown_value.DropdownWidget---placeholder>span"));
for(WebElement element : options){
 if(element.getText().equals("New Product Introduction")){
    element.click();
}
}

【讨论】:

  • 我已经在更新部分更新了我的代码,注意它会从下拉列表中选择新产品介绍。
  • 测试已通过,但未在 UI 中单击选项 :( 我已在问题中添加了我的类文件,也请参考。
  • 你是先点击下拉菜单吗?之后,我提供的脚本将起作用。你也可以检查列表的大小吗?
  • options.size() ,打印这个。
  • options.size() 返回值 '1'
【解决方案2】:

试试这个:

...
WebDriverWait wait = new WebDriverWait(driver,10);
WebElement option = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[contains(., 'New Product Introduction')]")));
option.click();
...

代替:

List<WebElement> options = driver.findElements(By.cssSelector("div.DropdownWidget---dropdown_value.DropdownWidget---placeholder>span"));
for(WebElement element : options){
   if(element.getText().equals("New Product Introduction")){
      element.click();
   }
}

点击打开下拉菜单后,等到元素可以点击,然后再点击它。

【讨论】:

  • 感谢您提供见解!我已经使用Sendkeyskeys.ENTER 对此进行了排序
  • @RajiMuthukumar 如果我的回答有用,您可以通过单击“否决”按钮下方的灰色复选按钮来标记我的回答。和/或投票))
【解决方案3】:

感谢@Cruisepandey 和@Andrei Suvorkov,我使用下面的代码在下拉菜单中找到并输入选项。

WebElement projectType = driver.findElement(By.id("_value"));
projectType.sendKeys("New Product Introduction");
projectType.sendKeys(Keys.ENTER);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 2021-10-31
    相关资源
    最近更新 更多