Actions类 - 单击(WebElement ele)函数不单击

时间:2015-10-16 21:15:23

标签: selenium selenium-webdriver

我正在尝试使用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]

请让我知道为什么点击事件不会被触发并解决相同的原因。

3 个答案:

答案 0 :(得分:2)

你犯了一个简单的错误:buildingperforming行动。 请注意,您已创建Actionsob的实例。由于名称表示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)

在网络自动化中,这个问题不断出现。原因可能是多方面的。让我们一一看看:

  1. 未正确使用操作类: Link to Official documentation

    正如方法文档所说,

<块引用>

在方法链的末尾调用 perform() 以实际执行操作。

使用 Actions 类实现点击的一般方法如下:

actionsObj.moveToElement(element1).click().build().perform()
  1. 如果 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);
  1. 假设所有这些都失败了,那么另一种方法是再次使用 Javascript 执行器,如下所示:

    executor.executeScript("arguments[0].click();", element1);

  2. 如果您仍然无法点击 ,则可能意味着两件事:

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() 
}