我只能在Chrome浏览器中看到。
完整的错误消息显示为:
“ org.openqa.selenium.WebDriverException:元素在点(411,675)不可点击。其他元素将获得点击:...”
“将获得点击”的元素位于相关元素的侧面,而不是在其顶部并且不重叠,也不在页面上移动。
我曾尝试添加偏移量,但这也不起作用。该项目位于显示的窗口中,无需滚动。
我只能在Chrome浏览器中看到。
完整的错误消息显示为:
“ org.openqa.selenium.WebDriverException:元素在点(411,675)不可点击。其他元素将获得点击:...”
“将获得点击”的元素位于相关元素的侧面,而不是在其顶部并且不重叠,也不在页面上移动。
我曾尝试添加偏移量,但这也不起作用。该项目位于显示的窗口中,无需滚动。
Answers:
这是由以下3种类型引起的:
1.单击该元素不可见。
使用动作或JavascriptExecutor使其单击。
通过动作:
WebElement element = driver.findElement(By("element_path"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().perform();
通过JavascriptExecutor:
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(250, 0)"); // if the element is on top.
jse.executeScript("scroll(0, 250)"); // if the element is on bottom.
要么
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].scrollIntoView()", Webelement);
然后单击元素。
2.页面在单击元素之前已刷新。
为此,使页面等待几秒钟。
3.该元素是可单击的,但是在其顶部有一个微调器/叠加层
下面的代码将等待,直到覆盖消失
By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));
然后单击元素。
您也可以使用JavaScript单击,然后就不需要滚动了。
IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);
actions.MoveToElement
在C#中对我不起作用,其他滚动解决方案似乎有些脆弱,因为滚动可能会无法正确显示元素,或者元素在页面上的位置可能会改变。
chromedriver中似乎有一个错误(问题是它被标记为无法修复)-> GitHub Link
(也许是对FreedomSponsors的赏金?)
在注释#27中建议了一种解决方法。也许它将为您工作-
我遇到了同样的问题,尝试了所有提供的解决方案,但它们对我不起作用。最终我用了这个:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('click',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);", findElement(element));
希望这可以帮助
哇,这里有很多答案,还有很多好的答案。
我希望我会根据自己的经验添加一些内容。
伙计们,在我的案例中,有一个Cookie覆盖层偶尔会隐藏该元素。滚动到该元素也可以;但是以我的拙见(对我而言,这并不是每个人的灵丹妙药),最简单的解决方案是全屏显示(我在3/4的屏幕窗口上运行脚本)!所以我们开始:
driver.manage().window().maximize();
希望有帮助!
红宝石/ watir-webdriver / chrome
我使用以下技巧,似乎可行:
#scroll to myelement
@browser.execute_script "window.scrollTo(#{myelement.element.wd.location[0]},#{myelement.element.wd.location[1]})"
# click myelement
myelement.when_present.fire_event("click")
我也为这个问题而苦恼。代码在FF中工作正常,在Chrome上失败。我试图做的是单击一个复选框-如果不在视图中,我将滚动查看并单击。即使在Chrome中滚动到视图中也可以使用,但勾选框的底部只有几个像素不可见,因此网络驱动程序拒绝单击它。
我的解决方法是这样的:
WebElement element = _sectorPopup.findElement(...);
((Locatable) element).getCoordinates().inViewPort();
try {
element.click();
} catch (Exception e) {
new Actions(getWebDriver()).sendKeys(Keys.PAGE_DOWN).perform();
element.click();
}
Chrome的sendKeys也有问题,有时需要使用Actions。显然,您需要知道哪个方向和需要走多少,以便您的行驶里程可能有所不同。但是我更喜欢JavaScript hack,因此我将其发布在这里,以防其他人发现它有用。
使用xvfb-run无头运行测试时出现此错误。他们在本地完美地工作。使用chrome,webdriver / chromedriver / chrome / java等版本完全相同。
chromedriver中的“无法修复”错误-TonyLâmpada 指出的GitHub链接表明,这可能与屏幕上可见/不可见有关。
xvfb运行的帮助消息显示以下内容:
-s ARGS --server-args=ARGS arguments (other than server number and
"-nolisten tcp") to pass to the Xvfb server
(default: "-screen 0 640x480x8")
更改xvfb的分辨率可使错误消失:
xvfb-run -s "-screen 0 1280x1024x16" ...
首先,尝试获取最新的Chrome驱动程序,并检查其是否可以解决问题。
就我而言,它不能解决问题。但是,到目前为止,以下解决方案对我有用。以下是C#代码,但是您可以使用特定语言遵循相同的逻辑。我们在这里做的是
步骤1:使用Selenium Actions对象专注于元素,
步骤2:然后在元素上单击
步骤3:如果有异常,则通过Selenium浏览器驱动程序的“ ExecuteScript”方法执行javascript脚本,从而在元素上触发javascript“ Click”事件。
您也可以跳过第1步和第2步,也仅尝试第3步。步骤3可以自行完成,但在一种情况下,我注意到一种奇怪的行为,在这种情况下,即使步骤3成功单击了元素,在单击元素后在代码的其他部分也导致了意外的行为。
try
{
//Setup the driver and navigate to the web page...
var driver = new ChromeDriver("folder path to the Chrome driver");
driver.Navigate().GoToUrl("UrlToThePage");
//Find the element...
var element = driver.FindElement(By.Id("elementHtmlId"));
//Step 1
new Actions(driver).MoveToElement(element).Perform();
//Step 2
element.Click();
}
catch (Exception)
{
//Step 3
driver.ExecuteScript("document.getElementById('elementHtmlId').click();");
}
我面临着一个类似的问题,我必须一个接一个地检查两个复选框。但是我在上述错误中遇到了同样的问题。因此我在检查复选框的步骤之间添加了等待时间....它的工作原理很好。步骤如下:-
When I visit /administrator/user_profiles
And I press xpath link "//*[@id='1']"
Then I should see "Please wait for a moment..."
When I wait for 5 seconds
And I press xpath link "//*[@id='2']"
Then I should see "Please wait for a moment..."
When I visit /administrator/user_profiles_updates
您需要在该元素上使用焦点或滚动。您可能还必须使用显式等待。
WebElement firstbutton= driver.findElement(By.xpath("Your Element"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();
要么
由于元素上方有一个微调器/叠加层,因此该元素不可单击:
By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));
要么
Point p= element.getLocation();
Actions actions = new Actions(driver);
actions.moveToElement(element).movebyoffset(p.x,p.y).click().perform();
要么
如果仍然无法使用,请使用 JavascriptExecutor
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", firstbutton);
显然,这是Chrome驱动程序二进制文件中的“无法修复”错误的结果。
在此Google组讨论中,评论#3可以找到一种对我有用的解决方案(我们的里程可能有所不同):
https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc
相关部分就在这里:
从那以后,我通过直接导航到跨度的父锚的href来解决此问题。
driver.Navigate()。GoToUrl(driver.FindElement(By.Id(embeddedSpanIdToClick))。FindElement(By.XPath(“ ..”))。GetAttribute(“ href”));
就我而言,我正在使用Python,所以一旦获得所需的元素,我就简单地使用
driver.get(ViewElm.get_attribute('href'))
我希望这只会起作用,但是,如果您要单击的元素是一个链接...
我遇到了与clj-webdriver (Selenium的clojure端口)相同的问题。为了方便起见,我只是将先前的解决方案翻译为clojure。您可以在单击或进行任何操作以避免此问题之前调用此函数。
(defn scrollTo
"Scrolls to the position of the given css selector if found"
[q]
(if (exists? q)
(let [ loc (location-once-visible q) jscript (str "window.scrollTo(" (:x loc) "," (:y loc) ")") ]
(execute-script jscript))))
如果在驱动程序尝试单击元素时元素更改位置,则可能会发生这种情况(我也在IE中看到过)。驱动程序会保留初始位置,但是到实际单击它时,该位置不再指向该元素。顺便说一句,FireFox驱动程序没有此问题,显然,它是通过编程方式“单击”元素。
无论如何,当您使用动画或简单地动态更改元素的高度(例如$("#foo").height(500)
)时,就会发生这种情况。您需要确保仅在元素的高度“固定”后单击元素。我最终得到的代码看起来像这样(C#绑定):
if (!(driver is FirefoxDriver))
{
new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(
d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize);
}
如果是动画或您无法轻松查询的任何其他因素,则可以利用“通用”方法来等待元素固定:
var prevLocation = new Point(Int32.MinValue, Int32.MinValue);
int stationaryCount = 0;
int desiredStationarySamples = 6; //3 seconds in total since the default interval is 500ms
return new WebDriverWait(driver, timeout).Until(d =>
{
var e = driver.FindElement(By.Id(someId));
if (e.Location == prevLocation)
{
stationaryCount++;
return stationaryCount == desiredStationarySamples;
}
prevLocation = e.Location;
stationaryCount = 0;
return false;
});
发生此错误的原因是,您尝试单击的元素不在浏览器的视口(用户看到的区域)中。因此,克服此问题的方法是先滚动到所需元素,然后执行单击。
Javascript:
async scrollTo (webElement) {
await this.driver.executeScript('arguments[0].scrollIntoView(true)', webElement)
await this.driver.executeScript('window.scrollBy(0,-150)')
}
Java:
public void scrollTo (WebElement e) {
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeAsyncScript('arguments[0].scrollIntoView(true)', e)
js.executeAsyncScript('window.scrollBy(0,-150)')
}
关于TonyLâmpada的回答,第27条评论确实为我解决了这个问题,除了它提供了Java代码并且我需要Python。这是一个Python函数,可滚动到元素的位置,然后单击它。
def scroll_to_and_click(xpath):
element = TestUtil.driver.find_element_by_xpath(xpath)
TestUtil.driver.execute_script('window.scrollTo(0, ' + str(element.location['y']) + ');')
element.click()
这为我在Chrome 34.0中解决了问题。它在Firefox 28.0和IE 11中没有造成任何损害。这些浏览器没有问题,但是在单击元素之前滚动到元素的位置仍然不是一件坏事。
有趣的是,我一直都在查看各种回应,没有人尝试过显而易见的回答,当然我也没有。如果您的页面具有与我相同的多次使用的ID(“ newButton”,),而您想要的不是第一次找到的页面,那么您很可能会遇到此错误。最简单的操作(C#):
var testIt = driver.FindElements(By.Id("newButton"));
请注意,它是FindElements,而不是FindElement。
然后测试以查看从检索中返回了多少结果。如果是第二个,则可以使用:
testit[1].Click();
或者让任何重复使用的ID来修复它们。
.First(x => x.Visible)
到FindElements调用),如果不为null,则单击该元素。
测试所有提到的建议后,没有任何效果。我写了这段代码。它有效,但不美观
public void click(WebElement element) {
//https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
while(true){
try{
element.click();
break;
}catch (Throwable e){
try {
Thread.sleep(200);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
public void click(String css) {
//https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
while(true){
try{
driver.findElement(By.cssSelector(css)).click();
break;
}catch (Throwable e){
try {
Thread.sleep(200);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
我做的是一种蛮力的点击,它对我有用。
try:
elem.click()
except:
print "failed to click"
size = elem.size
mid_of_y = int(size["height"])/2
stepts_to_do_to_left = int(size["width"])
while stepts_to_do_to_left > 0:
try:
print stepts_to_do_to_left, mid_of_y
action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(elem, mid_of_y, stepts_to_do_to_left)
action.click()
action.perform()
print "DONE CLICK"
break
except:
pass
我有同样的问题,它是由div和div内部链接之间的id冲突引起的。因此,驱动程序是单击div而不是我想要的链接。我更改了div ID,它正常工作。
之前:
<div id="logout"><a id="logout" href="logoutLink">logout</a></div>
后:
<div id="differentId"><a id="logout" href="logoutLink">logout</a></div>
在使用硒的 Drupal中:
// Get element.
$element = $this->driver->getElement('xpath=//input');
// Get screen location.
$location = $element->getLocation();
// To make sure that Chrome correctly handles clicking on the elements
// outside of the screen, we must move the cursor to the element's location.
$this->driver->moveCursor($location['x'], $location['y']);
// Optionally, set some sleep time (0.5 sec in the example below) if your
// elements are visible after some animation.
time_nanosleep(0, 500000000);
// Click on the element.
$element->click();