单击坐标而不标识元素

时间:2011-07-21 11:33:35

标签: selenium selenium-rc

作为登录功能的硒测试的一部分,我想通过识别其坐标点击按钮,并指示硒点击这些坐标。这将在没有实际识别元素本身的情况下完成(通过id,xpath等)。

我知道还有其他更有效的方法来运行click命令,但我希望专门使用这种方法来最好地匹配用户体验。感谢。

18 个答案:

答案 0 :(得分:29)

这样做的方法。使用ActionChains API,您可以将鼠标移到元素上,按一些偏移量调整(相对于元素的中间),然后单击该位置。以下是在Python中使用webdriver的方法:

elem = find_element_by_selector(selector)
ac = ActionChains(browser)
ac.move_to_element(elem).move_by_offset(x_off, y_off).click().perform()

你们都很快就要解开这个问题。有许多理由需要在特定位置点击,而不是在元素上点击。在我的例子中,我有一个带有覆盖元素的SVG条形图,可以捕获所有点击。我想在其中一个条上模拟点击,但由于叠加层在那里,Selenium无法点击元素本身。这种技术对于图像映射也很有价值。

答案 1 :(得分:17)

在C#API中,您可以使用操作

var element = driver.FindElement(By...);
new Actions(driver).MoveToElement(element).MoveByOffset(dx, dy).Click().Perform();

尽管最好只使用简单的Id,CSS,Xpath选择器。但是在需要时功能就在那里(即在某些地理位置点击元素以获得功能)。

答案 2 :(得分:8)

可以使用Actions

中的java类来完成此操作

使用以下代码 -

new Actions(driver).moveByOffset(x coordinate, y coordinate).click().build().perform(); 

注意: Selenium 3不支持Actions

geckodriver课程

另外,请注意x和y坐标是当前鼠标位置的相对值。假设鼠标坐标在(0,0)处开始,如果你想使用绝对值,你可以在使用上面的代码点击它后立即执行以下操作。

new Actions(driver).moveByOffset(-x coordinate, -y coordinate).perform();

答案 3 :(得分:5)

我首先使用JavaScript代码,在网站没有点击之前,它的运行效果惊人。

所以我找到了这个解决方案:

首先,为Python导入ActionChains并将其激活:

from selenium.webdriver.common.action_chains import ActionChains
actions = ActionChains(driver)

要在会话中单击特定点,请使用以下方法:

actions.move_by_offset(X coordinates, Y coordinates).click().perform()

注意:上面的代码仅在未触摸鼠标的情况下有效,要重置鼠标坐标,请使用以下代码:

actions.move_to_element_with_offset(driver.find_element_by_tag_name('body'), 0,0))

完整:

actions.move_to_element_with_offset(driver.find_element_by_tag_name('body'), 0,0)
actions.move_by_offset(X coordinates, Y coordinates).click().perform()

答案 4 :(得分:4)

如果您选择使用Selenium的商业插件,则可以 :假设您的按钮位于坐标x=123, y=456处。然后,您可以使用Helium点击这些坐标处的元素,如下所示:

from helium.api import *
# Tell Helium about your WebDriver instance:
set_driver(driver)
click(Point(123, 456))

(我是Helium的作者之一。)

答案 5 :(得分:3)

这在Java中对我来说都是有效的,它可以单击任何元素上的坐标。

Actions actions = new Actions(driver);
actions.moveToElement(driver.findElement(By.tagName("body")), 0, 0);
actions.moveByOffset(xCoordinate, yCoordinate).click().build().perform();

第二行代码会将光标重置到浏览器视图的左上角,最后一行将单击作为参数提供的x,y坐标。

答案 6 :(得分:1)

您可以通过iMacros http://www.iopus.com/iMacros/

执行此操作

答案 7 :(得分:1)

在Selenium Java中,您可以使用Javascript尝试:

WebDriver driver = new ChromeDriver();

if (driver instanceof JavascriptExecutor) {
	((JavascriptExecutor) driver).executeScript("el = document.elementFromPoint(x-cordinate, y-cordinate); el.click();");
}

答案 8 :(得分:1)

我使用上面列出的许多动作类,但我发现有用的是如果我需要从元素中找到相对位置我使用Firefox Add-On Measurit来获取相对坐标。 例如:

        IWebDriver driver = new FirefoxDriver();
        driver.Url = @"https://scm.commerceinterface.com/accounts/login/?next=/remittance_center/";
        var target = driver.FindElement(By.Id("loginAsEU"));
        Actions builder = new Actions(driver);            
        builder.MoveToElement(target , -375  , -436).Click().Build().Perform();

我通过点击一个元素得到了-375,-436,然后向后拖动直到我到达我需要点击的点。 MeasureIT说我刚刚减去的坐标。在上面的例子中,我在页面上唯一可点击的元素是" loginAsEu"链接。所以我从那里开始。

答案 9 :(得分:0)

Selenium::WebDriverPointerActions 模块,其中包含许多可以链接和/或触发而无需指定元素的操作,例如。 move_to_locationmove_by。见detailed specs here。如您所见,您只能使用实际坐标。我确信这个接口是在其他语言/库中相应地实现的。

我的简短回复可能会回应这里的其他一些评论,但我只是想提供一个链接以供参考。

答案 10 :(得分:0)

如果本页提到的所有其他方法都失败了并且您使用的是 python,我建议您使用 mouse module 以更原生的方式来执行它。代码很简单

import mouse
mouse.move("547", "508")
mouse.click(button='left')

您还可以使用 keyboard module 来模拟键盘操作

import keyboard
keyboard.write('The quick brown fox jumps over the lazy dog.')

要找到鼠标的坐标,您可以使用以下 JavaScript 代码。

document.onclick=function(event) {
    var x = event.screenX ;
    var y = event.screenY;
    console.log(x, y) 
}

如果你不喜欢 screenX,你可以使用 pageX 或 clientX。有关 here

的更多信息

附言我遇到了一个阻止与 JavaScript/DOM/Selenium 进行编程交互的网站。这大概是一种机器人预防机制。但是,他们无法禁止操作系统操作。

答案 11 :(得分:0)

补充一点,因为我为此苦苦挣扎了一段时间。这些是我采取的步骤:

  1. 找到您需要点击的坐标。在您的控制台中使用以下代码,它会显示您需要的坐标并发出警报。
document.onclick = function(e)
{
    var x = e.pageX;
    var y = e.pageY;
    alert("User clicked at position (" + x + "," + y + ")")
};
  1. 确保该元素在屏幕上实际可见,然后使用 Actionchains 单击它
WebDriverWait(DRIVER GOES HERE, 10).until(EC.element_to_be_clickable(YOUR ELEMENT LOCATOR GOES HERE)) 
        actions = ActionChains(DRIVER GOES HERE)
        actions.move_by_offset(X, Y).click().perform() 

答案 12 :(得分:0)

我用AutoIt来做。

using AutoIt;
AutoItX.MouseClick("LEFT",150,150,1,0);//1: click once, 0: Move instantaneous
  1. 专业版:
    • 简单
    • 不管鼠标如何移动
  2. 骗局:
    • 由于坐标是基于屏幕的,因此如果应用程序缩放,应格外小心。
    • 驱动器不知道应用程序何时完成点击后果操作。应该有一个等待期。

答案 13 :(得分:0)

import pyautogui
from selenium import webdriver

driver = webdriver.Chrome(chrome_options=options)
driver.maximize_window() #maximize the browser window
driver.implicitly_wait(30)
driver.get(url)
height=driver.get_window_size()['height']

#get browser navigation panel height
browser_navigation_panel_height = driver.execute_script('return window.outerHeight - window.innerHeight;')

act_y=y%height
scroll_Y=y/height

#scroll down page until y_off is visible
try:
    driver.execute_script("window.scrollTo(0, "+str(scroll_Y*height)+")")
except Exception as e:
    print "Exception"
#pyautogui used to generate click by passing x,y coordinates
pyautogui.FAILSAFE=False
pyautogui.moveTo(x,act_y+browser_navigation_panel_height)
pyautogui.click(x,act_y+browser_navigation_panel_height,clicks=1,interval=0.0,button="left")

这对我有用。希望,它将对你们有用:)...

答案 14 :(得分:0)

    WebElement button = driver.findElement(By.xpath("//button[@type='submit']"));
    int height = button.getSize().getHeight();
    int width = button.getSize().getWidth();
    Actions act = new Actions(driver);
    act.moveToElement(button).moveByOffset((width/2)+2,(height/2)+2).click();

答案 15 :(得分:0)

行动链可能有点挑剔。您也可以通过执行javascript实现此目的。

self.driver.execute_script('el = document.elementFromPoint(440, 120); el.click();')

答案 16 :(得分:-3)

答案 17 :(得分:-13)

Selenium不允许你这样做。