【发布时间】:2018-03-04 17:10:46
【问题描述】:
我想右键单击一个链接并在上下文菜单中选择第一个选项。
我尝试了以下五种方法,但没有任何效果。所有方法都在点击 以正常方式链接,但没有发生上下文点击。
有人能解释一下这是怎么回事吗?
我使用的环境是...selenium-3.4.0, FF 53, Windows 7
package WebDriverAdvancedPrograms;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
public class RightClick {
public static void main(String[] args) throws InterruptedException, AWTException {
System.setProperty("webdriver.gecko.driver", "G:\\Selenium\\geckodriver-v0.16.0-win64\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.get("http://facebook.com");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
WebElement element=driver.findElement(By.linkText("Forgotten account?"));
// // Method 1 - NOT WORKING
// Actions builder = new Actions(driver);
// Action mouseOverHome = builder
// .moveToElement(element)
// .contextClick(element)
// .sendKeys(Keys.DOWN)
// .sendKeys(Keys.ENTER)
// .build();
// mouseOverHome.perform();
// Method 2 - NOT WORKING
// Actions builder = new Actions(driver);
// Action mouseOverHome = builder
// .moveToElement(element)
// .contextClick(element)
// .sendKeys(Keys.ARROW_DOWN)
// .sendKeys(Keys.RETURN)
// .build();
// mouseOverHome.perform();
// Method 3 - NOT WORKING
// Actions builder = new Actions(driver);
// Action mouseOverHome = builder
// .contextClick(element)
// .sendKeys(Keys.ARROW_DOWN)
// .sendKeys(Keys.RETURN)
// .build();
// mouseOverHome.perform();
// Method 4 - NOT WORKING
// Actions builder = new Actions(driver);
// Action mouseOverHome = builder
// .contextClick(element)
// .sendKeys(Keys.ARROW_DOWN)
// .sendKeys(Keys.ARROW_UP)
// .sendKeys(Keys.RETURN)
// .build();
// mouseOverHome.perform();
// // Method 5 - NOT WORKING
Actions action= new Actions(driver);
action.contextClick(element).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.RETURN).build().perform();
// Method 6 - Partially WORKING
Point p = element.getLocation();
int x = p.getX();
int y = p.getY();
Robot r=new Robot();
r.mouseMove(x, y);
r.mousePress(InputEvent.BUTTON3_MASK);
r.mouseRelease(InputEvent.BUTTON3_MASK);
r.keyPress(KeyEvent.VK_DOWN);
r.keyRelease(KeyEvent.VK_DOWN);
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
//Method 7 - WORKING
Robot r=new Robot();
r.mouseMove(1000, 145);
r.mousePress(InputEvent.BUTTON3_MASK);
r.mouseRelease(InputEvent.BUTTON3_MASK);
r.keyPress(KeyEvent.VK_DOWN);
r.keyRelease(KeyEvent.VK_DOWN);
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
}
}
方法 6 部分有效意味着...上下文点击发生在屏幕上,但不在元素上。
在方法 7 中,我手动输入了 x,y 位置它的工作...
方法6不起作用的原因是x,从getLocation方法获取的y与浏览器有关,但机器人类与屏幕有关..
我的问题是如何获取与屏幕相关的元素的确切位置
谢谢 拉维M
【问题讨论】:
-
你可以使用机器人类
-
我尝试使用机器人类..上下文点击正在发生但不是在元素上。你能看到上面代码中的方法6和方法7吗..