我正在尝试使用Actions类的点击(WebElement)方法点击Google主页上的元素。代码运行成功,但click事件不是trigerred。
package p1;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.WebElement;
public class ClickLink
{
static WebDriver driver;
public static void main(String[] args)
{
try
{
driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.get("http://www.google.com/");
WebElement icon = driver.findElement(By.xpath(".//*[@id='gbwa']/div[1]/a"));
Actions ob = new Actions(driver);
ob.click(icon);
System.out.println("Link Clicked !!");
Thread.sleep(10000);
driver.close();
}
catch(Exception e)
{
System.out.println("Exception occurred : "+e);
driver.close();
}
}
}
执行上述脚本时的结果如下:[link]
但是,当使用WebElement接口的click()方法单击相同的元素时,则会触发单击。
package p1;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.WebElement;
public class ClickLink
{
static WebDriver driver;
public static void main(String[] args)
{
try
{
driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.get("http://www.google.com/");
WebElement icon = driver.findElement(By.xpath(".//*[@id='gbwa']/div[1]/a"));
icon.click();
System.out.println("Link Clicked !!");
Thread.sleep(10000);
driver.close();
}
catch(Exception e)
{
System.out.println("Exception occurred : "+e);
driver.close();
}
}
}
执行上述脚本时的结果如下:[link]
请让我知道为什么点击事件不会被触发并解决相同的原因。
答案 0 :(得分:2)
你犯了一个简单的错误:building
和performing
行动。
请注意,您已创建Actions
类ob
的实例。由于名称表示Actions
类定义了一组要执行的顺序操作。因此,您必须build()
您的行为才能创建一个Action
,然后perform()
该行动。
以下代码应该可以使用!!
WebElement icon = driver.findElement(By.xpath(".//*[@id='gbwa']/div[1]/a"));
Actions ob = new Actions(driver);
ob.click(icon);
Action action = ob.build();
action.perform();
如果您查看下面给出的代码,首先转到icon
元素,然后单击该元素将更好地解释Actions
类。
Actions ob = new Actions(driver);
ob.moveToElement(icon);
ob.click(icon);
Action action = ob.build();
action.perform();
答案 1 :(得分:0)
以下是您需要做的事情:
ob.click(icon).build().perform();
你也可以这样做:
ob.moveToElement(icon).click().build().perform();
答案 2 :(得分:0)
在网络自动化中,这个问题不断出现。原因可能是多方面的。让我们一一看看:
未正确使用操作类: Link to Official documentation
正如方法文档所说,
在方法链的末尾调用 perform() 以实际执行操作。
使用 Actions 类实现点击的一般方法如下:
actionsObj.moveToElement(element1).click().build().perform()
如果 Actions 类失败,有时原因可能是您收到以下异常:
ElementNotInteractableException [object HTMLSpanElement] 没有大小和位置
这可能意味着两件事:
一个。元素未正确呈现:对此的解决方案只是使用隐式/显式等待
隐式等待:
driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
显式等待:
WebDriverWait wait=new WebDriverWait(driver, 20); element1 = wait.until(ExpectedConditions.elementToBeClickable(By.className("fa-stack-1x")));
B.元素已呈现,但它不在屏幕的可见部分:解决方案只是滚动到元素。基于 Selenium 的版本,它可以以不同的方式处理,但我将提供一个适用于所有版本的解决方案:
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].scrollIntoView(true);", element1);
假设所有这些都失败了,那么另一种方法是再次使用 Javascript 执行器,如下所示:
executor.executeScript("arguments[0].click();", element1);
如果您仍然无法点击 ,则可能意味着两件事:
1. iframe
检查 DOM 以查看您正在检查的元素是否存在于任何框架中。如果这是真的,那么您需要在尝试任何操作之前切换到此帧。
driver.switchTo().frame("a077aa5e"); //switching the frame by ID
System.out.println("********We are switching to the iframe*******");
driver.findElement(By.xpath("html/body/a/img")).click();
2.新标签
如果打开了一个新选项卡并且该元素存在于其上,则您再次需要编写类似下面的代码以在尝试操作之前切换到它。
String parent = driver.getWindowHandle();
driver.findElement(By.partialLinkText("Continue")).click();
Set<String> s = driver.getWindowHandles();
// Now iterate using Iterator
Iterator<String> I1 = s.iterator();
while (I1.hasNext()) {
String child_window = I1.next();
if (!parent.equals(child_window)) {
driver.switchTo().window(child_window);
element1.click()
}