【问题标题】:How to select element in span dropdown menu cssSelector webdriver Java如何在跨度下拉菜单中选择元素 cssSelector webdriver Java
【发布时间】:2015-05-29 08:41:03
【问题描述】:

单击打开下拉菜单的按钮后,我试图在 webdriver 中选择这些元素。我可以点击按钮很好,它会随着下降。

WebElement providers = driver.findElement(By.id("providers"));
      providers.click();

HTML

<input id="providers" class="providersOff" type="button">
<div id="providers-list" class="">
    <ul>
        <li ng-click="searchProvider(0)">
            <div class="imageContainer">
                <span>Google</span> <--TRYING TO SELECT THIS

我正在尝试选择 Google 元素。

这两种方法我都试过了,还是不行:

driver.findElement(By.cssSelector(".imageContainer[Google]"));
driver.findElement(By.cssSelector(".providers-list > li[ng-click*= searchProvider(0)]"));

它运行得非常好:

  // Assign search-bar & send keys
      WebElement searchbar = driver.findElement(By.id("txtSearch"));
      searchbar.sendKeys("Pizza");


      // Assign provider drop-down & click
      WebElement providers = driver.findElement(By.id("providers"));
      providers.click();

【问题讨论】:

    标签: java css selenium css-selectors webdriver


    【解决方案1】:

    应该是:

    div.imageContainer > span
    

    这基本上意味着:

    给我span 元素,它是div 元素与class="imageContainer" 的直接子元素。

    要获取实际文本,请使用.text

    WebElement span = driver.findElement(By.cssSelector("div.imageContainer > span"));
    System.out.println(span.text);
    

    如果你想通过文本匹配span,你可以使用xpath

    WebElement google = driver.findElement(By.xpath("//div[@class='imageContainer']/span[. = 'Google']"));
    google.click();
    

    或者,您也可以依赖li 元素的ng-click 属性:

    WebElement span = driver.findElement(By.cssSelector("li[ng-click$='(0)'] > div.imageContainer > span"));
    

    其中$=ends-with selector

    【讨论】:

    • 之后如何选择谷歌?语法是什么? driver.findElement(By.cssSelector("div.imageContainer > span[Google]"));
    • 嗨亚历克斯,提到有多个选项,因为这是一个下拉列表,我如何指向谷歌而不是像雅虎这样的另一个选项。
    • @Elsid 好的,更新了答案,希望这就是你想说的。
    • 嗨,Alex,我知道我可以轻松使用 xpath,只是想让它与 css 一起工作,因为开发人员很少对其进行更改,作为一种更合理的方式,将来不会破坏事物谢谢.
    • @Elsid 好吧,有contains(),但是,据我了解,这不太可靠,尤其是在多个浏览器上执行时。试试看:div.imageContainer &gt; span:contains('Google').
    【解决方案2】:

    熟悉基本的 CSS 选择器可能对您有好处。试试玩这个游戏,我从中学到了很多:https://flukeout.github.io/

    现在回到你原来的问题。根据您提供的代码部分,最短的选择器就是span

    driver.findElement(By.cssSelector("span")); - 它说给我一个 html 标签 但我假设你的页面上有很多跨度,所以这个选择器可能不是唯一的。

    driver.findElement(By.cssSelector("#providers-list span")); - 搜索 id=providers-list 的元素并在此元素中搜索标签跨度。这可能就足够了,但如果你在这个特定的 div 中有很多跨度,你可以这样做:

    driver.findElement(By.cssSelector("#providers-list .imageContainer span")); - 搜索 id=providers-list 的元素,在此元素中搜索具有包含 imageContainer 的类属性的后代,然后搜索标签跨度。

    您还可以提供元素的完整路径: driver.findElement(By.cssSelector("#providers-list &gt; ul &gt; li &gt; .imageContainer &gt; span")); - '>' 表示去直接孩子,而空格表示去后代(无论多深)。

    编辑

    如果 ng-click 是唯一的唯一属性,那么代码将如下所示 driver.findElement(By.cssSelector("#providers-list li[ng-click='searchProvider(0)'] &gt; .imageProvider &gt; span"));

    EDIT2

    您可能需要在展开下拉菜单后等待元素变得可见(在您执行 providers.click() 之后)

    WebDriverWait wait = new WebDriverWait(driver, 10);
    String selector = "#providers-list li[ng-click='searchProvider(0)'] > .imageProvider > span";
    WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(selector)));
    

    【讨论】:

    • 问题是所有的选项都是跨度谷歌,雅虎,他们只改变
    • 0 是谷歌,1 是雅虎,等等。
  • @Elsid 你是什么意思它没有工作?转到 Chrome,打开开发工具(按 F12)并转到 javascript 控制台。将以下内容粘贴到控制台中:$$("#providers-list li[ng-click='searchProvider(0)'] &gt; .imageProvider &gt; span") 它是否返回一个元素?
  • 故障排除片刻
  • 添加了更多信息,我认为可能存在元素不可见的问题,即使我可以单击主下拉按钮并激活它。检查主要问题
  • 我本来用thread.sleep试过没用,我只是用你的等待方法试了,还是不行。引发此错误:无法定位元素:{"method":"id","selector":"custom_google_btn"}。将使用实时网站链接更新我的主要问题,也许您可​​以弄清楚发生了什么,我也会更新我的更多代码。检查主要问题
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签