gpt4 book ai didi

java - 如果 xpath 返回 2 个 WebElements,Selenium 可以只单击可见元素吗

转载 作者:行者123 更新时间:2023-11-29 07:30:51 25 4
gpt4 key购买 nike

我有一个响应式设计,我需要与之交互的很多项目都有 2 个 WebElements。一个用于桌面,一个用于移动,我正在尝试使用 PageFactory。这是我现在要识别元素并与之交互的内容。

//this returns 2 webelements, one for desktop and one for mobile
@FindBy(xpath = "//selector-dropdown/p")
private WebElement dropdown;

public void ClickDropdown() throws InterruptedException {
WebDriverWait wait = new WebDriverWait(driver, 15);
wait.until(ExpectedConditions.visibilityOf(dropdown)).click();

}

我的印象是 ExpectedConditions.visibilityOf(WebElement) 会发现第一个元素可见。现在,当我在桌面上打开应用程序时,它会找到该元素(桌面在 DOM 中位于第一个)。但在移动设备上,它会在等待可见性时超时,因为它一直在等待第一个可见性。

我的替代方法是使用@FindBy 对每个元素声明两次,然后使用 if 语句来决定采用哪条路径。这种额外的工作是让它发挥作用的唯一方法吗?

最佳答案

您的假设“... ExpectedConditions.visibilityOf(WebElement) 会发现第一个元素可见。”是错的!您需要将您的 WebElement 声明为一个列表,找到所有这些,然后选择一个可见的。这是我过去成功使用的示例:

@FindBy(xpath = "//input[@ng-model='loginData.username']")
private List<WebElement> txtUsername;

public String getUsername() {
driverWait.until(CustomExpectedConditions.presenceOfAllElements(txtUsername));
for (WebElement oneUsername : txtUsername) {
if (oneUsername.isDisplayed())
return oneUsername.getAttribute("value");
}
return null;
}

public void setUsername(String username) {
driverWait.until(CustomExpectedConditions.presenceOfAllElements(txtUsername));
for (WebElement oneUsername : txtUsername) {
if (oneUsername.isDisplayed()) {
oneUsername.clear();
oneUsername.sendKeys(username);
break;
}
}
}

根据其他地方的讨论,这里是 CustomExpectedConditions:

public class CustomExpectedConditions {
/**
* Based on {@link ExpectedConditions#presenceOfAllElementsLocatedBy(org.openqa.selenium.By)}.
*
* @param elements
* @return
*/
public static ExpectedCondition<List<WebElement>> presenceOfAllElements(
final List<WebElement> elements) {
return new ExpectedCondition<List<WebElement>>() {

@Override
public List<WebElement> apply(WebDriver driver) {
// List<WebElement> elements = findElements(locator, driver);
return elements.size() > 0 ? elements : null;
}
};
}
}

关于java - 如果 xpath 返回 2 个 WebElements,Selenium 可以只单击可见元素吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42955960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com