Selenium 在坐标处单击而不标识元素

Selenium 在坐标处单击而不标识元素,selenium,selenium-rc,Selenium,Selenium Rc,作为登录函数Selenium测试的一部分,我想通过标识按钮的坐标并指示Selenium在这些坐标处单击来单击按钮。这将在不标识元素本身的情况下完成(通过id、xpath等) 我知道还有其他更有效的方法来运行click命令,但我希望特别使用这种方法来最好地匹配用户体验。谢谢。如果您能看到页面的源代码,那么通过其id或NAME属性引用按钮总是最好的选择。例如,您的“登录”按钮如下所示: <input type="submit" name="login" id="login" /> 只

作为登录函数Selenium测试的一部分,我想通过标识按钮的坐标并指示Selenium在这些坐标处单击来单击按钮。这将在不标识元素本身的情况下完成(通过id、xpath等)


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

如果您能看到页面的源代码,那么通过其id或NAME属性引用按钮总是最好的选择。例如,您的“登录”按钮如下所示:

 <input type="submit" name="login" id="login" />
只是出于好奇——这不是HTTP基本身份验证吗?在这种情况下,不妨看看这个:
硒不会让你这么做。有一种方法可以做到这一点。使用ActionChains API,您可以将鼠标移动到包含元素上,调整一些偏移量(相对于该元素的中间),将“光标”放置在所需按钮(或其他元素)上,然后单击该位置。下面介绍如何在Python中使用webdriver:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
browser = webdriver.Chrome()
elem = browser.find_element_by_selector(".some > selector")
ac = ActionChains(browser)
ac.move_to_element(elem).move_by_offset(x_offset, y_offset).click().perform()
你们很快就会忽略这个问题。可能需要在特定位置而不是在元素上单击的原因有很多。在我的例子中,我有一个SVG条形图,其中有一个覆盖元素,可以捕捉所有的点击。我想模拟在其中一个条上单击,但由于覆盖层存在,Selenium无法单击元素本身。这项技术对于imagemaps也很有价值。

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

var元素=driver.FindElement(By…);
新操作(驱动程序)。moveToElement(元素)。moveByOffset(dx,dy)。单击()。执行();
尽管最好尽可能只使用简单的Id、CSS和Xpath选择器。但是当需要时,功能就在那里(即单击某些地理位置的元素以获得功能)。

如果您可以选择使用Selenium的商业附加组件,这是可能的:假设您的按钮位于坐标
x=123,y=456
。然后可以使用单击这些坐标处的图元,如下所示:

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

(我是氦的作者之一。)

动作链可能有点挑剔。您还可以通过执行javascript来实现这一点

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

这可以使用
java

使用以下代码-

new Actions(driver).moveByOffset(x coordinate, y coordinate).click().build().perform(); 
注意:Selenium 3不支持
geckodriver的
操作

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


新操作(驱动程序).moveByOffset(-x坐标,-y坐标).perform()

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

WebDriver=new ChromeDriver();
if(JavascriptExecutor的驱动程序实例){
((JavascriptExecutor)driver).executeScript(“el=document.elementFromPoint(x-cordinate,y-cordinate);el.click();”;

}
我使用了Actions类,就像上面列出的许多类一样,但是我发现如果我需要从使用Firefox Add-On Measureit的元素中找到一个相对位置来获得相对坐标,那么它会很有帮助。 例如:

        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,点击一个元素,然后向后拖动,直到我到达我需要点击的点。我刚才说的坐标是减去的。在我上面的例子中,我在页面上唯一可以点击的元素是“loginAsEu”链接。所以我从那里开始。

我第一次使用JavaScript代码,它工作得令人惊讶,直到一个网站没有点击

    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();
所以我找到了这个解决方案:

首先,导入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_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()

这是为我工作。希望,它会对你们有用:)…

这在Java中对我来说很有用,因为我可以在任何元素上单击坐标

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

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

我使用AutoIt来完成此操作

using AutoIt;
AutoItX.MouseClick("LEFT",150,150,1,0);//1: click once, 0: Move instantaneous
  • 赞成者:
    • 简单的
    • 不管鼠标移动
  • 反对:
    • 由于坐标是基于屏幕的,因此如果应用程序进行缩放,应该注意一些
    • 驱动器不知道应用程序何时完成单击结果操作。应该有一段等待期

  • 再加上这一点,因为我为此挣扎了一段时间。以下是我采取的步骤:

  • 找到需要单击的坐标。在控制台中使用下面的代码,它将显示并提醒您所需的坐标
  • 确保元素在屏幕上实际可见,并使用Actionchains单击它

  • 谢谢,但这不是我想要的。我知道selenium可以通过id简单地点击一个按钮。但是我希望尽可能地模拟用户体验,因此我想点击上面解释的方法中的按钮。是否有另一个测试框架可以实现这一点?或者是Selenium的用户扩展?感谢您的回复。您的建议对于测试web应用程序来说通常是一个坏主意,原因比评论中的要多。既然你坚持这样做,你一定有一个很好的理由,但我想不出一个。无论如何,你必须寻找一个比Selenium复杂得多的系统,可能专注于测试本机应用程序。对于Windows,这通常意味着AutoIt()。我认为这是误导,可能是使用操作(见下文)。@ChrisRaastad OP说“单击这些坐标。这将完成。”
    document.onclick = function(e)
    {
        var x = e.pageX;
        var y = e.pageY;
        alert("User clicked at position (" + x + "," + y + ")")
    };
    
    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()