【问题标题】:Cannot get Selenium Actions to build() & perform()无法获取 Selenium 操作来构建()和执行()
【发布时间】:2017-12-15 04:16:19
【问题描述】:

我的智慧到此为止。我假设我做错了什么,但我无法在我的一生中弄清楚是什么。

我有一个导航栏,我试图将鼠标悬停在主元素上,这会导致下拉菜单展开,然后单击 IEx86 中的子元素。这看起来很简单,对吧?

HTML(通用):

<nav class="navHeader">
	<ul class="topNavigation">
		<li class="firstItem"><a href="/Home">Home</a></li>
		<li class="current"><a href="javascript:void(0)">Transactions</a>
			<ul style="display: block;">
				<li class=""><a class="tabbedTransactions" href="/Transaction/#li1">li1</a></li>
				<li class=""><a class="tabbedTransactions" href="/Transaction/#li2">li2</a></li>
				<li class=""><a class="tabbedTransactions" href="/Transaction/#li3">li3</a></li>
				<li class=""><a class="tabbedTransactions" href="/Transaction/#li4">li4</a></li>
				<li class=""><a class="tabbedTransactions" href="/Transaction/#li5">li5</a></li>
				<li class="current bottomSubNav"><a href="/li6/" class="current bottomSubNav">li6</a></li>
			</ul>
		</li>
	</ul>
</nav>

认为会起作用(如果我在代码运行时将 ACTUAL 光标悬停在 Transaction 元素上会起作用)(WebElements 都是通过 xpath 找到并传入的,xpath 已使用验证一个插件)(驱动程序是 WebDriver 和类的公共部分)

public void HoverClick(WebElement hover, WebElement click)
{   
    Actions actions = new Actions(driver);
    actions.moveToElement(hover).click(click).build().perform();
}

.moveToElement 似乎没有移动到,因此无法点击。 (甚至没有闪烁的导航栏项目扩展)

public void HoverClick(WebElement hover, WebElement click)
{   
    Actions actions = new Actions(driver);
    actions.moveToElement(hover).build().perform();
    actions.click(click).build().perform();
}

有了这个,moveToElement 移动到(导航栏扩展)但.click(click) 失败。离开 moveToElement.perform() 不会导致行为发生任何变化。

public void HoverClick(WebElement hover, WebElement click)
{   
    Actions actions = new Actions(driver);
    actions.moveToElement(hover).build().perform();
    actions.pause(Duration.ofMillis(1000)).build().perform();
    actions.click(click).build().perform();
}

有了这个,.pause() 第一次是 .build().perform()-ed 有一个暂停。第二次(.click().build().perform())没有暂停。

我不知道从这里做什么。如前所述,如果我将鼠标悬停在 nav 元素上,则代码执行得很好。请帮忙?

【问题讨论】:

  • 我通常使用Actions 进行悬停,但只使用普通的element.click()。你试过吗?您是否尝试过在悬停之前添加等待?您是否确信它在代码运行时存在并且可以悬停?确认这一点的一种方法是在调用HoverClick() 之前放置一个断点。一旦它中断,一次单步执行一行代码,看看它是否有效。
  • 听从您的建议,它看起来像以下工作:actions.moveToElement(hover).perform(); click.click(); 为什么会起作用,.build().perform() 不会让我感到困惑。
  • 好吧,有一些警告。请查看我的“答案”和相关评论?请? :)

标签: java selenium internet-explorer


【解决方案1】:

以下作品:

public void HoverClick(WebElement hover, WebElement click)
{   
    Actions actions = new Actions(driver);
    actions.moveToElement(hover).perform();
    click.click();
}

使用.build().perform() 不起作用。这似乎导致“鼠标”悬停一次,然后再次悬停并移开。

仅使用.build() 根本不起作用(并不惊讶,但想检查#QALife)。原来的根本没用。这似乎是 Selenium 中的一个重要问题......

【讨论】:

  • 如果有人读到这个。这段代码的行为非常不一致。有时它工作得很好,有时它根本不起作用。如果我在 Actions 和 Click 之间放置一个 Thread.Sleep(500); ,它永远不会起作用。我已经在 HoverClick 和任何下一步之间进行了 5 秒的睡眠,但仍然不能始终如一地执行。我可以看到页面上的元素,但它的性能并不一致。任何建议将不胜感激。
  • 如果在悬停前暂停会怎样?这会让事情更加一致吗?我想知道执行该部分脚本时,您悬停的元素是否处于一致状态。
  • 另一种选择是只使用 Javascript 来单击菜单项而无需悬停。我尽量避免这种情况,因为这不是用户会做的事情,但有时这是你唯一可以开始工作的事情。
  • 通过从.xpath 切换到.cssSelector 似乎有所帮助...我遇到“干净运行”然后“元素不可点击”失败。
  • 如果您实际上在两者中定位相同的元素,那么 CSS 选择器与 XPath 确实应该有所不同。我猜你只是走运了。
猜你喜欢
  • 2013-11-19
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 2019-06-12
  • 2023-03-22
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多