有很多项目,我得到了所需项目的对象。但是我不知道如何单击该对象中的子元素。 html:
<div class="item">
<div role="button" tabindex="-1">
<strong>ItemName2</strong>
</div>
<div class="d">
<div class="item-icon" role="button" tabindex="-1" style="display: none">
<i aria-label="icon: add" class="add"></i> <!-- I need to click on this Item -->
</div>
<div class="item-icon" role="button" tabindex="-1" style="display: none">
<i aria-label="icon: del" class="del"></i>
</div>
</div>
</div>
<div class="item"> ... </div>
<div class="item"> ... </div>
<div class="item"> ... </div>
js:
let fBtns = await driver.findElements(By.tagName('strong')); // Find all objects
let buttons = fBtns.map(elem => elem.getText());
const allButtons = await Promise.all(buttons);
console.log(allButtons); // All object names
let current = fBtns[fBtns.length - 1];
console.log(current); // This is desired object
await current.click(); // This is click on the object and operates as expected
// But I need to click on the <i aria-label="icon: add" class="add"> element
// How can I click on the desired element?
答案 0 :(得分:1)
尝试通过触发方法调用click:
$('.item-icon .add').trigger("click");
答案 1 :(得分:1)
要单击元素<i aria-label="icon: del" class="del"></i>
,只需使用XPath直接在元素上查询:
await driver.findElement(By.xpath("//div[div/strong[text()='ItemName2']]/div/div/i[@class='del']")).click()
您可以将其缩短为:
await driver.findElement(By.xpath("//div[div/strong[text()='ItemName2']]//i[@class='del']")).click()
答案 2 :(得分:1)
在下面的示例中,我扫描文档以查找动态xpath,该动态xpath使用字符串ItemName2找到强项,然后在向下移动到子元素之前回滚上一层(/../)。这将像waitForElement一样,您可以希望将其用于触发点击。
var MyDefaultTimeout = 1500;
var loaded = false;
do {
var icon = document.getElementsByClassName('//*[contains(@strong,\'ItemName2\')]/../div/div/i');
if(!icon.length == 0)
{
setTimeout(function() { loaded = false }, MyDefaultTimeout);
}
else
{
if(!document.readyState === 'complete')
{
setTimeout(function() { loaded = false }, MyDefaultTimeout);
}
else
{
loaded = true;
return document.readyState;
}
}
}
while(loaded === false);