【问题标题】:Selenium Webdriver Multiselect Dropdown ElementNotVisibleExceptionSelenium Webdriver Multiselect Dropdown ElementNotVisibleException
【发布时间】:2016-08-12 15:43:20
【问题描述】:

尝试从多选下拉框中进行选择,发现似乎是一个不错的资源。

我正在处理http://preview.harriscountyfws.org/ 我正在尝试在“按代理机构选择”多选下拉列表中选择多个项目。

我在这里向您展示的逻辑非常简单,并且遵循我找到的文章(如下所示),但我得到 WebDriverException: Cannot click on option element。

有什么建议可以让逻辑有效吗?

逻辑如下:

WebElement we;
String searchText;
WebDriver driver;
Select select;
WebElement listbox_element;
listbox_element = driver.findElement(By.cssSelector("span[aria-owns='ddlRegion_listbox']"));
listbox_element.click();

driver = new FirefoxDriver();
driver.get("http://preview.harriscountyfws.org/");

searchText="ALL";
we = driver.findElement(By.id("ddlRegion"));
select = new Select(we);
select.selectByVisibleText(searchText);

参考号:http://www.techbeamers.com/dropdown-and-multiple-select-in-webdriver

【问题讨论】:

  • 注意:代码已从原始问题编辑;异常也发生了变化:WebDriverException:无法单击选项元素。添加到发布的原始问题的新行是:WebElement listbox_element; listbox_element = driver.findElement(By.cssSelector("span[aria-owns='ddlRegion_listbox']")); listbox_element.click();

标签: java selenium webdriver


【解决方案1】:

我认为您没有找到正确的选择元素。您正在尝试的不是可见状态而是隐藏状态(可见:无)。

您需要找到“按代理机构搜索”下拉菜单的箭头并找到该元素并单击它以使下拉菜单可见。我不确定是否在 xpath 中包含 aria-owns 属性,但这是最简单的方法。你可以看看。

"//div[@id='searchDiv']//span[@aria-owns='ddlRegion_listbox']//span[@class='k-select']"

然后您需要等待 div[@id='regionSelectPopup'] 可见。将其粘贴在具有预期可见性条件的 webdriverwait 中。

然后你可以在 div 中选择你想要的选项。我已经为所有人做了。您将需要对其进行参数化。点击它。

"//div[@id='regionSelectPopup']//label[.='ALL']/preceding-sibling::input[@type='checkbox']"

它也可能与标签一起使用,但找不到复选框。

希望这行得通。

        WebDriver driver = new FirefoxDriver();             
    driver.manage().window().maximize();        

    driver.get("http://preview.harriscountyfws.org/");

    WebElement agencySearchSelect = driver.findElement(
            By.xpath("//div[@id='searchDiv']//span[@aria-owns='ddlRegion_listbox']//span[@class='k-select']"));

    agencySearchSelect.click();

    new WebDriverWait(driver, 3, 100).until(ExpectedConditions.visibilityOfElementLocated(
            By.id("regionSelectPopup")));

    WebElement agencyOption = driver.findElement(
            By.xpath("//div[@id='regionSelectPopup']//label[.='ALL']/preceding-sibling::input[@type='checkbox']"));

    agencyOption.click();

【讨论】:

  • Grasshopper:我是 Selenium 的新手,所以我了解了一些。这是我在之前显示的代码之前添加的代码,用于在尝试选择选项之前实现单击并使内容可见,但现在我得到了一个不同的异常:无法单击选项元素。这是我在显示代码之前添加的代码:WebElement listbox_element; listbox_element = driver.findElement(By.cssSelector("span[aria-owns='ddlRegion_listbox']")); listbox_element.click();
  • 您的代码有效 :) 您如何确定 xpath 中的内容?长得像中国人。是否有一些关于如何确定我需要在那里做什么的说明手册,或者我需要去学习更多的 html 或其他东西?多谢!我稍后会接受答案。我想为任何人可能想要分享的任何 cmet 保留这个问题,然后如果没有人有其他要说的,我会接受答案。
  • Selenium 就是定位你想玩的 HTML 元素。可以使用 id、class 等来完成。如果你没有这些会很糟糕,那么你必须使用 CSS 或 xpath。如果你做过任何网页工作,CSS 应该很熟悉。否则你必须把它捡起来。大多数 CSS 和 xpath 都可以从浏览器和 firefox 中的 firebug 等工具获得。但是你去微调它们。快乐学习。
  • Grasshopper,我使用我在视频中找到的技术,为“All”复选框获得了与 Firefox 完全不同的 Xpath。我得到了 xpath: /html/body/div[1]/div[3]/div/div/div[19]/div[1]/ul/li[1]/input FOR: 使用 Firebug(看起来非常好用且简单)和我在youtube.com/watch?v=ohY815wUz9o 中找到的技术@ 任何有关这方面的 cmets?我不知道这个是否有效,但你的有效。试图将这个谜题组合在一起。像 vdo 中提到的那样,有一种始终查找 xpath 的好方法会很好。
  • firebug 给出的是一个绝对路径(以 / 开头),它从 html 标签开始跟踪页面的整个结构。将其用作获取 xpath 的非常基本的方法。想象一下页面的开发者修改了页面,并在你从 firebug 获得的路径中插入了一个新元素。你的测试将被拍摄,你需要重复。最好是使用相对路径(以 // 开头)通过识别直接使用 id(最首选)或任何唯一属性的元素,如果不上一级并重复标识部分。尽量保持路径简短,这样更改就不会轻易搞砸。
猜你喜欢
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多