【问题标题】:Enable and select values of Drop-down based on the value selected in another Drop-down根据在另一个下拉列表中选择的值启用和选择下拉列表的值
【发布时间】:2015-06-25 21:26:39
【问题描述】:

我在一个页面上有几个下拉菜单;在第一个下拉菜单中选择一个值后,第二个下拉菜单将被启用并相应地加载值。

手动运行时,在 First Drop-down 中选择一个值后,页面会加载并启用 Second Drop-down,并根据 First Drop-down 中选择的值列出值。

但是,当使用 Selenium Webdriver(Java 中)进行自动化时,只有 First Drop-down 的值被选中,而 Second Drop-down 永远不会启用或加载这些值。

即使尝试使用 WebDriverWait 如下,但仍然没有运气。

WebDriverWait wait = new WebDriverWait(wd, 50);
wait.until(ExpectedConditions.elementToBeClickable(By.id("event")));

注意到只有我们移出页面 (ALT+TAB) 并再次进入该页面正在加载的页面并启用了第二个下拉菜单。

下面的异常也会抛出,

org.openqa.selenium.TimeoutException: Timed out after 50 seconds waiting for element to be clickable: By.id: event

请指教。

使用页面对象模型编码:

在 POM 类中:

//Create Object for Page 1
CreateAsset asset = PageFactory.initElements(wd,CreateAsset.class);


//Read the values of First & Second Drop-down from an excel

String list_event_type = readsheet.getRow(1).getCell(2).getStringCellValue();
String list_event = readsheet.getRow(1).getCell(3).getStringCellValue();

//Calling Drop-down methods in Page Factory POM Class 
asset.selectEventType(list_event_type);

WebDriverWait wait = new WebDriverWait(wd, 50);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("event")));
asset.selectEvent(list_event);

在页面工厂类中:

//select the given value on the First Drop-down

@FindBy(how = How.ID, using = "eventType")
public WebElement   eventType;

public void selectEventType(String eventType)
{
    this.eventType.sendKeys(eventType);
}

//select the given value on Sescond Drop-down

@FindBy(how = How.ID, using = "event")
public WebElement   event;

public void selectEvent(String event)
{
    this.event.sendKeys(event);
}

【问题讨论】:

  • 请分享与选择第一个下拉菜单相关的代码
  • 发布MCVE(最小完整可验证示例)或SSCCE(简短、独立、正确示例)

标签: java drop-down-menu selenium-webdriver


【解决方案1】:

您正在使用同一个页面对象来选择两个值,问题是页面对象只初始化一个(在一开始。这意味着当 eventType 元素更改时,事件属性永远不会用值初始化。

两种选择:
1.选择eventType后重新初始化页面对象

//Calling Drop-down methods in Page Factory POM Class 
asset.selectEventType(list_event_type);
asset = PageFactory.initElements(wd,CreateAsset.class);
  1. 改变 selectEventType 以返回一个新的页面对象,本质上这和上面做的一样

    public CreateAsset selectEventType(String eventType)
    {
    this.eventType.sendKeys(eventType);
    返回新的 CreateAsset(_driver);
    }

然后你会在你的 POM 中调用它

asset = asset.selectEventType(list_event_type);

【讨论】:

  • 我似乎无法正确格式化,抱歉。希望对你有帮助
  • 史蒂夫,谢谢您的回复!当我尝试使用选项 1 时仍然出现异常。但是,我刚刚通过自动按 ALT+TAB 的手动解决方法成功选择了第二个下拉菜单。 wd.findElement(By.cssSelector("body")).sendKeys(Keys.chord(Keys.ALT, Keys.TAB));
  • 啊,我明白了。您选择第一个下拉列表的方法没有触发 JS 填充第二个!
【解决方案2】:

以下解决方法按预期效果很好!

wd.findElement(By.cssSelector("body")).sendKeys(Keys.chord(Keys.ALT, Keys.TAB));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多