时间:2017-01-04 10:43:21

标签: selenium xpath

我有一个文本框可以输入一些卡片详细信息。我有两个案例

1)在登录帐户前输入此文本框 2)登录帐户后在此文本框中输入

登录帐户后此文本框的元素复制,即我在页面源中得到两个id="cn",因此我的驱动程序无法找到该元素,因此无法进入文本框。

使用绝对xpath不是一个选项,因为它是动态变化的。

以下是html

登录前我只能得到以下内容:

html/body/div/div/div[12]/div[2]/div/div[4]/div[2]/div[3]/div[2]/form/ul/li[1]/p/input[1]

        <ul class="grid">
            <li class="mb20 card-wrapper">
                <label class="mb10" for="cardNumber">ENTER CREDIT CARD NUMBER</label>
                <p class="cd">

                    <input autocomplete="off" type="text" name="" class="ccCardNumber  text-input large-input c cardInput type-tel" id="cn" size="16" maxlength="19" style="width: 278px" data-type="cc" 
                    value=""> 
                    <input type="hidden" name="cardNumber" value="" class="required">
                </p>

登录后我得到如下:

html/body/div/div/div[12]/div[2]/div/div[5]/div[2]/div[3]/div[3]/form/ul/li[1]/p/input[1]

        <ul class="grid">
            <li class="mb20 card-wrapper">
                <label class="mb10" for="cardNumber">ENTER CREDIT CARD NUMBER</label>
                <p class="cd">

                    <input autocomplete="off" type="text" name="" class="ccCardNumber  text-input large-input c cardInput type-tel" id="cn" size="16" maxlength="19" style="width: 278px" data-type="cc" 
                    value=""> 
                    <input type="hidden" name="cardNumber" value="" class="required">
                </p>

        <input type="hidden" name="addMoney" value="1" />
        <ul class="grid">
            <li class="mb20 card-wrapper">
                <label class="mb10" for="cardNumber">ENTER CREDIT CARD NUMBER</label>
                <p class="cd">

                    <input autocomplete="off" type="text" name="" class="ccCardNumber  text-input large-input c cardInput type-tel" id="cn" size="16" maxlength="19" style="width: 278px" data-type="cc" 
                    value=""> 
                    <input type="hidden" name="cardNumber" value="" class="required">
                </p>

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

对于每个输入,HTML结构体看起来都是一样的,所以你可以用xpath以相同的方式找到所有输入,你可以试试这个:

//li[descendant::*[contains(text(),'ENTER CREDIT CARD NUMBER')]]//input[@type='text']

如果浏览器中只显示一个文本框,但您可以在HTML中找到多个文本框,那么您可以尝试仅查找可见元素:

  String xpath = "//li[descendant::*[contains(text(),'ENTER CREDIT CARD NUMBER')]]//input[@type='text']";
  WebElement visibleInput = findVisibleElement(xpath); 

findVisibleElement ()方法正文如下:

public WebElement findVisibleElement(final String xpath) {
    return new WebDriverWait(driver, 30).until(new Function<WebDriver, WebElement>() {
        public WebElement apply(WebDriver input) {
            Iterator<WebElement> iterator = driver.findElements(By.xpath(xpath)).iterator();
            while (iterator.hasNext()) {
                WebElement element = iterator.next();
                try {
                    if (element.isDisplayed())
                    return element;
                } catch (Exception e) {
                    return null;
                }
            }
            return null;
        }
    });
}

请注意,在这种情况下,我使用标签文本作为xpath字符串的引用,但您可以使用任何其他cssSelector。