我有一个文本框可以输入一些卡片详细信息。我有两个案例
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>
任何人都可以帮我解决这个问题吗?
答案 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。