作为登录功能的硒测试的一部分,我想通过识别其坐标点击按钮,并指示硒点击这些坐标。这将在没有实际识别元素本身的情况下完成(通过id,xpath等)。
我知道还有其他更有效的方法来运行click命令,但我希望专门使用这种方法来最好地匹配用户体验。感谢。
答案 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::WebDriver
有 PointerActions
模块,其中包含许多可以链接和/或触发而无需指定元素的操作,例如。 move_to_location
或 move_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)
补充一点,因为我为此苦苦挣扎了一段时间。这些是我采取的步骤:
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()
答案 12 :(得分:0)
我用AutoIt来做。
using AutoIt;
AutoItX.MouseClick("LEFT",150,150,1,0);//1: click once, 0: Move instantaneous
答案 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不允许你这样做。