无法单击嵌套在范围

时间:2018-02-08 18:23:17

标签: xpath selenium-webdriver

我无法点击“选择图片”按钮。这是html:

<tr ng-controller="MasterImageController" ng-init="init(0)" class="ng-scope">
    <td rowspan="2" valign="top"></td>
    <td>
        <div class="alert alert-success" style="display: none;" id="masterImageMessageContainer">
            <span id="masterImageMessage">&nbsp;</span>
        </div>
        <div>
            <span class="btn btn-success btn-file">
                <span class="glyphicon glyphicon-picture">
                    ::before
                </span>
                " Select image "
                <input type="file" name="masterImage-file" onchange="angular.element(this).scope().masterImageFileChanged(this)" value="" id="masterImage-file">
            </span>
            <span class="ng-binding"></span>
        </div>
    </td>
</tr>

我试过了:

By.xpath("input[@name='masterImage-file']"))

但无法通过此xpath单击该按钮。没有框架。

错误显示:

  

预期条件失败:等待位于以下位置的元素:By.xpath:input [@ name ='masterImage-file'](尝试30秒,间隔为500 MILLISECONDS)

另一条消息显示

  

无法找到该元素。

我添加了Thread.sleep(1500);

3 个答案:

答案 0 :(得分:0)

我认为您可以使用double slash //

作为前缀

//input[@name='masterImage-file']

您也可以使用该ID确保其唯一//input[@id='masterImage-file']

答案 1 :(得分:-1)

选择图片不在<input>标记内,而是在<span>标记内。要单击选择图像按钮,您可以使用以下定位器策略

By.xpath("//tr[@class='ng-scope']//td//span[btn btn-success btn-file]")

元素是 Angular Element ,您可能需要在点击之前诱导 WebDriverWait ,如下所示( Java ):

new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//tr[@class='ng-scope']//td//span[btn btn-success btn-file]"))).click();

更新:

您可以更精细地使用以下代码行:

new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//tr[@class='ng-scope']//td//span[btn btn-success btn-file]/span[@class='glyphicon glyphicon-picture']"))).click();

答案 2 :(得分:-1)

我不确定你为什么不使用这个ID。

By locator = By.id("masterImage-file");

如果此ID在页面上不唯一,则这是另一个选项

By locator = By.xpath("//span[contains(.,'Select image')]//input");

我还会添加一个等待以确保元素已加载。可能是页面的一部分加载缓慢

new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(locator)).click();

如果由于某种原因无效,您需要调查:

  1. 这个元素是否在IFRAME中?我知道你说不是,但你应该再检查一下。这是造成这类错误的典型原因。

  2. 这个元素在页面上是唯一的吗?在打开页面的Chrome中打开开发控制台,然后尝试$$("#masterImage-file")。它是否返回超过1个元素?如果确实如此,那可能就是问题所在。您必须找到另一种方法来引用此INPUT