Gỡ lỗi Element Element không thể nhấp vào tại điểm lỗi lỗi


397

Tôi chỉ thấy điều này trong Chrome.

Thông báo lỗi đầy đủ đọc:

"org.openqa.selenium.WebDriverException: Phần tử không thể nhấp được tại điểm (411, 675). Phần tử khác sẽ nhận được nhấp chuột: ..."

Phần tử 'sẽ nhận được nhấp chuột' nằm ở bên cạnh phần tử được đề cập, không nằm trên phần tử đó và không chồng chéo lên phần đó, không di chuyển xung quanh trang.

Tôi đã thử thêm một phần bù, nhưng nó cũng không hoạt động. Mục này nằm trên cửa sổ hiển thị mà không cần cuộn.


2
Bạn có chờ tải trang không? Có lẽ các yếu tố khác chồng lấp nó trong khi trang đang tải?
Herokiller

55
Câu chuyện dài cho những người mới đến - CÁC YẾU TỐ KHÔNG THAM GIA VÀO TRANG VÀ KHÔNG CÓ NHẤP VÀO. BẠN CẦN PHÙ HỢP VỚI XEM XEM B BYNG cửa sổ EMITTING.ScrollTo.
Chris B. BehDR

67
@ ChrisB.BehDR Điều này không phải luôn luôn như vậy. Lỗi cụ thể này cũng có thể được đưa ra khi một yếu tố được bao phủ bởi một yếu tố khác. Tôi đã có ngoại lệ này khi cố gắng nhấp vào một nút là một yếu tố khác với tư thế cố định.
Martin Cassidy

4
Chromedriver không chỉ có vấn đề tương tự với Firefox. Tôi đã khắc phục sự cố bằng cách thực hiện độ trễ để đợi cho đến khi trang được tải lại hoàn toàn, như đề xuất của những người khác ở trên.
codervince 13/03/2016

5
Tôi nghĩ rằng đây là lời khuyên hoàn toàn sai lầm khi phát ra cuộnTo hoặc thực hiện bất kỳ chờ đợi nào. Có vẻ như thuật toán nhấp chuột selen là: 1. tính toán vị trí phần tử 2. di chuyển đến vị trí này (vì vậy bạn không cần phải tự phát hành) 3. nhấp vào vị trí này (ngoại trừ từ xác nhận cuối cùng kiểm tra phần tử nào đứng trên phần tử này vị trí ngay trước khi gửi sự kiện nhấp thực tế) Lời khuyên của tôi là: 1. kiểm tra xem phần tử có nằm trong khung nhìn của bạn không. 2. kiểm tra xem phần tử có được bao phủ bởi bất kỳ phần tử nào khác không (như các menu dính), ẩn chúng nếu có, hoặc cuộn thủ công trước khi nhấp mà không cần dựa vào cuộn cuộn dựng sẵn.
Vitalik Verhovodov 18/03/2016

Câu trả lời:


325

Điều này được gây ra bởi 3 loại sau:

1. Phần tử không hiển thị để nhấp.

Sử dụng Tác vụ hoặc JavascriptExecutor để làm cho nó nhấp.

Bằng hành động:

WebElement element = driver.findElement(By("element_path"));

Actions actions = new Actions(driver);

actions.moveToElement(element).click().perform();

Bởi 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.

hoặc là

JavascriptExecutor jse = (JavascriptExecutor)driver;

jse.executeScript("arguments[0].scrollIntoView()", Webelement); 

Sau đó bấm vào yếu tố.

2. Trang đang được làm mới trước khi nhấp vào phần tử.

Đối với điều này, làm cho trang chờ trong vài giây.

3. Phần tử có thể nhấp nhưng có phần tử / lớp phủ bên trên phần tử

Đoạn mã dưới đây sẽ đợi cho đến khi lớp phủ biến mất

By loadingImage = By.id("loading image ID");

WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);

wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

Sau đó bấm vào yếu tố.


52
Có một loại nguyên nhân thứ ba, đó là yếu tố của bạn được gói trong một div hoặc một khoảng. Trang có thể được tải đầy đủ và hoàn toàn trong chế độ xem, nhưng Chromedriver sẽ từ chối nhấp vào nó, nơi mà webroll cho FF và IE không gặp vấn đề gì. Một con người thực sự không có đầu mối nào cho thấy khoảng đó tồn tại và trình duyệt không quan tâm khi bạn thực sự nhấp vào nó, như một con người. Không di chuyển xung quanh, cũng không chờ đợi sẽ giải quyết vấn đề này; hoặc tránh Chrome / chromedriver hoặc viết lại HTML của trang dường như là các tùy chọn duy nhất cho mọi người trong trường hợp 3.
Don Simon

54
@DonSimon Tôi có vấn đề tương tự như bạn đã làm. Tôi đã có thể khắc phục bằng cách sử dụng .SendKeys (Keys.Return) thay vì .Click. Điều này hoạt động với tôi trong Chrome khi tôi gặp vấn đề này và trong Firefox nơi tôi gặp vấn đề tương tự khác trên liên kết cụ thể này (neo được bao bọc trong Div).
Peter Bernier

17
Giải pháp được đề xuất bởi @PeterBernier hoạt động tốt trong trường hợp phần tử được gói trong một div hoặc một khoảng. Trong Python tôi đã sử dụng .send_keys ('\ n') để mô phỏng nhấp chuột và khắc phục sự cố trong Chrome.
GJ

4
Nếu một phần tử bị ẩn bởi một phần tử div, đoạn mã sau sẽ sửa nó. execJavascript ("argument [0] .click ();", selenium.findEuity (locator));
EsotericNonsense

Bạn cũng có thể đợi phần tử có thể nhấp được. chờ đợi.Until (ExpectedConditions.EuityToBeClickable (webEuity));
Chielus

67

Bạn cũng có thể sử dụng JavaScript và cuộn sẽ không cần thiết sau đó.

IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);

5
Không thể tin được! Tôi tự hỏi tại sao selen không làm hỏng phương thức click () mà họ cung cấp, với điều kiện là có các điều kiện trong đó isDisplayed () và isEnables () không đủ để nhấp vào một phần tử và đây dường như là một giải pháp duy nhất. Cảm ơn!
Giovanni Bitliner

2
+1: Đây là giải pháp hiệu quả với tôi. actions.MoveToElementkhông hoạt động với tôi trong C # và các giải pháp cuộn khác có vẻ hơi mong manh ở chỗ có khả năng cuộn có thể không chính xác đưa phần tử vào xem hoặc vị trí của phần tử trên trang có thể thay đổi.
Người dùng

1
giải pháp này là dễ nhất nếu phần tử không được xem, nhưng tồn tại trên trang
Yashveer Rana

@Giovanni Bitliner Họ không cung cấp phương pháp này vì đây không phải là một kịch bản người dùng thực sự. Người dùng cũng phải đợi cho đến khi bộ nạp biến mất. Tôi nghĩ đó là một điều tuyệt vời về selen.
Gideon Mulder

+1 Cũng làm việc cho tôi. Chỉ cần thêm phương thức flwg vào mã của tôi: `private void jsClick (phần tử IWebE bổ sung, trình điều khiển IWebDriver) {IJavaScriptExecutor ex = (IJavaScriptExecutor); ex.ExecuteScript ("argument [0] .click ();", phần tử); } `được gọi theo cách này: 'jsClick (driver.FindEuity (By.XPath (" xpathOfTheEuity "))); `
Jeremias

46

Dường như có một lỗi trong chromedriver cho vấn đề đó (vấn đề là nó được đánh dấu là sẽ không sửa) -> Liên kết GitHub

(đặt tiền thưởng cho FreedomSponsors có lẽ?)

Có một cách giải quyết được đề xuất tại bình luận # 27. Có lẽ nó sẽ làm việc cho bạn-


4
Có vẻ công bằng - nếu nút không xuất hiện trên màn hình thì nó không thực sự có thể nhấp được.
Evan Knowles

Đây không phải là một lỗi. Đây là hành vi dự định và nó là chính xác. Như đề xuất khác, nếu phần tử nằm ngoài chế độ xem - bạn cần cuộn đến nó.
Alex Skrypnyk

Tôi đã thử Firefox và thấy nó không có lỗi này, nhưng lần nhấp vẫn bị bỏ qua. Hóa ra là div cha có chiều cao bằng không. Khi đã được sửa, cả hai đều hoạt động tốt.
dansalmo

35

Tôi có cùng một vấn đề, đã thử tất cả các giải pháp được cung cấp nhưng chúng không hiệu quả với tôi. cuối cùng tôi đã sử dụng nó:

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));

Hi vọng điêu nay co ich


16

Tôi đã thấy điều này trong tình huống khi cửa sổ Chrome điều khiển bằng selen được mở quá nhỏ. Phần tử được nhấp vào nằm ngoài khung nhìn và do đó nó bị lỗi.

Nghe có vẻ hợp lý ... người dùng thực sự sẽ phải thay đổi kích thước cửa sổ hoặc cuộn để có thể thấy phần tử và thực tế nhấp vào nó.

Sau khi hướng dẫn trình điều khiển selen đặt kích thước cửa sổ một cách thích hợp, vấn đề này đã biến mất đối với tôi. API webdo được giải mã ở đây .


15

Wow, rất nhiều câu trả lời ở đây, và nhiều câu trả lời hay.

Tôi hy vọng tôi sẽ thêm một cái gì đó vào kinh nghiệm này.

Vâng, trong trường hợp của tôi, thỉnh thoảng có một lớp phủ cookie ẩn phần tử. Cuộn đến phần tử cũng hoạt động; nhưng theo ý kiến ​​khiêm tốn của tôi (đối với trường hợp của tôi, không phải là thuốc chữa bách bệnh cho mọi người), giải pháp đơn giản nhất là đi toàn màn hình (tôi đã chạy các tập lệnh của mình trên 3/4 cửa sổ màn hình)! Vì vậy, ở đây chúng tôi đi:

driver.manage().window().maximize();

Mong rằng sẽ giúp!


13

ruby / watir-webdo / chrome

Tôi sử dụng thủ thuật sau đây và có vẻ như nó hoạt động:

#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")

1
Vấn đề tôi đang thấy là với một bản đồ khu vực. Lỗi giống như bài viết gốc ở đây - một div "trước" khu vực tôi cần nhấp. Đó không phải là vấn đề tải AJAX / thời gian / trang và khu vực này ở chế độ xem toàn bộ - tôi thậm chí không thể cuộn để tập trung vào nó. Tuy nhiên, việc thay đổi phương thức nhấp của tôi từ object.click sang object.fire_event ("click") dường như đã giải quyết được vấn đề cho tôi. Tôi đã để nó trong khối bắt đầu / cứu để nó không ảnh hưởng đến cách Firefox nhấp bình thường.
adam sậy

Cách tiếp cận này đã giải quyết vấn đề cho tôi khi có các yếu tố không thể nhìn thấy trong chế độ xem.
Jason R. Coombs

13

Tôi cũng vậy, vật lộn với vấn đề này. Mã hoạt động tốt trong FF, không thành công trên Chrome. Những gì tôi đã cố gắng làm là nhấp vào một hộp kiểm - nếu nó không ở chế độ xem, tôi sẽ cuộn để xem và sau đó nhấp. Ngay cả khi cuộn vào chế độ xem hoạt động trong Chrome, chỉ có một vài pixel dưới cùng của hộp kiểm tra không hiển thị nên webdo từ chối nhấp vào nó.

Cách giải quyết của tôi là thế này:

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 cũng có vấn đề với sendKeys, sử dụng Hành động đôi khi là cần thiết. Rõ ràng, bạn cần biết hướng nào và bạn cần đi bao nhiêu để số dặm của bạn có thể thay đổi. Nhưng tôi thích điều này hơn với hack javascript, vì vậy tôi sẽ đăng nó ở đây trong trường hợp người khác sẽ thấy nó hữu ích.


Định vị được phản đối.
Steve Staple

12

Tôi đã gặp lỗi này khi chạy thử nghiệm không đầu với xvfb-run. Họ đã làm việc hoàn hảo tại địa phương. Sử dụng chrome, các phiên bản của webdo / chromedriver / chrome / java, v.v ... đều giống hệt nhau.

Lỗi 'sẽ không sửa' trong chromedriver - Liên kết GitHub được chỉ ra bởi Tony Lâmpada cho rằng điều này có thể liên quan đến những gì không thể nhìn thấy trên màn hình.

Thông báo trợ giúp cho xvfb-run hiển thị như sau:

-s ARGS   --server-args=ARGS    arguments (other than server number and
                                "-nolisten tcp") to pass to the Xvfb server
                                (default: "-screen 0 640x480x8")

Thay đổi độ phân giải cho xvfb đã khiến lỗi không còn nữa:

xvfb-run -s "-screen 0 1280x1024x16" ...

9

Khi sử dụng Protractor, điều này đã giúp tôi:

var elm = element(by.css('.your-css-class'));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
elm.click();

8

Trước tiên, hãy thử tải trình điều khiển Chrome mới nhất và kiểm tra xem nó có giải quyết được vấn đề không.

Trong trường hợp của tôi, nó đã không khắc phục vấn đề. Nhưng, giải pháp sau đây làm việc cho tôi cho đến nay. Sau đây là mã C # nhưng bạn có thể theo cùng logic trong ngôn ngữ cụ thể của mình. Những gì chúng tôi làm ở đây là,

Bước 1: Tập trung vào phần tử bằng cách sử dụng đối tượng Hành động Selenium,

Bước 2: Sau đó nhấp vào phần tử

Bước 3: Nếu có ngoại lệ, thì chúng tôi sẽ kích hoạt sự kiện "Nhấp chuột" javascript trên phần tử bằng cách thực thi tập lệnh javascript thông qua phương thức "ExecuteScript" của trình duyệt Selenium.

Bạn cũng có thể bỏ qua bước 1 và 2 và chỉ thử bước 3. Bước 3 sẽ tự hoạt động nhưng tôi nhận thấy một số hành vi lạ trong một kịch bản trong đó bước 3, mặc dù nó đã nhấp thành công vào phần tử, gây ra hành vi không mong muốn trong các phần khác của mã của tôi sau khi nhấp vào phần tử.

            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();");

            }

Tôi đã có vấn đề tương tự. Bước 1 của bạn sử dụng lớp Hành động hoạt động rất tốt. Tôi sẽ không bao giờ nghĩ về điều này. Cảm ơn!
Conner

Bước đầu tiên của bạn là một giải pháp tuyệt vời.
Sovandara LENG

7

Tôi đã thực hiện phương pháp này dựa trên nhận xét từ câu trả lời của Tony Lâmpada. Nó hoạt động rất tốt.

def scroll_to(element)
  page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})")
end

6

Tôi đã gặp vấn đề tương tự trong khi chạy tập lệnh selen trong python. Đây là những gì tôi đã sử dụng để nhấp vào phần tử:

from selenium.webdriver.common.action_chains import ActionChains


ActionChains(driver).click(element).perform()

5

Tôi đã phải đối mặt với một vấn đề tương tự khi tôi phải kiểm tra hai hộp kiểm lần lượt. Nhưng tôi đã nhận được cùng một lỗi ở trên. Tôi đã thêm chờ đợi giữa các bước để kiểm tra các hộp kiểm .... nó hoạt động tốt và tuyệt vời. đây là các bước: -

  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

Chỉ cần thêm rằng đây không phải là cách thích hợp để sử dụng cú pháp Gherkin. Các bước nên ở dạng "được cho - khi - sau đó" và những bước này không nên được trộn lẫn. Nếu cần nhiều "whens" hơn sau "thì", có lẽ cần một trường hợp thử nghiệm riêng.
Floella

5

Bạn cần sử dụng tiêu điểm hoặc cuộn trên phần tử đó. Bạn cũng có thể phải sử dụng chờ đợi.

WebElement firstbutton= driver.findElement(By.xpath("Your Element"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();

HOẶC LÀ

Phần tử không thể nhấp được do Spinner / Overlay ở trên nó:

By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

HOẶC LÀ

Point p= element.getLocation();
Actions actions = new Actions(driver);
actions.moveToElement(element).movebyoffset(p.x,p.y).click().perform();

HOẶC LÀ

Nếu vẫn không làm việc sử dụng JavascriptExecutor

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", firstbutton);

3

Rõ ràng đây là kết quả của lỗi "Không sửa" trong tệp nhị phân trình điều khiển Chrome.

Một giải pháp hiệu quả với tôi (Mileage May Vary May) có thể được tìm thấy trong cuộc thảo luận về Nhóm Google này, Nhận xét # 3:

https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc

Phần có liên quan ở ngay đây:

Kể từ đó, tôi đã giải quyết vấn đề bằng cách điều hướng trực tiếp tới href của neo chính của nhịp.

driver.Navigate (). GoToUrl (driver.FindEuity (By.Id (embedSpanIdToClick)). FindEuity (By.XPath ("..")). GetAttribution ("href"));

Trong trường hợp của tôi, tôi đang sử dụng Python, vì vậy một khi tôi đã có được phần tử mong muốn, tôi chỉ đơn giản sử dụng

driver.get(ViewElm.get_attribute('href'))

Tôi hy vọng điều này chỉ hoạt động, tuy nhiên, nếu yếu tố bạn đang cố gắng nhấp vào là một liên kết ...


3

Tôi đã phải đối mặt với cùng một vấn đề với clj-webdo (cổng clojure của Selenium). Tôi chỉ dịch các giải pháp trước đó để clojure cho thuận tiện. Bạn có thể gọi chức năng này trước khi thực hiện nhấp chuột hoặc bất cứ điều gì để tránh vấn đề đó.

(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))))

3

Điều này có thể xảy ra nếu phần tử thay đổi vị trí trong khi trình điều khiển đang cố gắng nhấp vào nó (tôi cũng đã thấy điều này với IE). Trình điều khiển giữ vị trí ban đầu nhưng đến khi thực sự nhấp vào vị trí đó, vị trí đó không còn trỏ đến phần tử đó nữa. Trình điều khiển FireFox không có vấn đề này BTW, rõ ràng nó "nhấp chuột" các phần tử theo chương trình.

Dù sao, điều này có thể xảy ra khi bạn sử dụng hình ảnh động hoặc đơn giản là thay đổi chiều cao của các phần tử một cách linh hoạt (ví dụ $("#foo").height(500)). Bạn cần đảm bảo rằng bạn chỉ nhấp vào các yếu tố sau khi chiều cao của chúng đã "ổn định". Tôi đã kết thúc với mã trông như thế này (các ràng buộc C #):

if (!(driver is FirefoxDriver))
{
    new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(
        d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize);
}

Trong trường hợp hoạt hình hoặc bất kỳ yếu tố nào khác mà bạn không thể dễ dàng truy vấn, bạn có thể sử dụng phương pháp "chung" để chờ phần tử đứng yên:

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;
});

Đây dường như là những gì tôi đang trải nghiệm. Tôi liên tục nhận được ngoại lệ "Yếu tố khác sẽ ..." của OP, nhưng ảnh chụp màn hình cho thấy phương thức nằm trên màn hình và yếu tố không được bảo hiểm và tôi sử dụng chờ trước khi nhấp. Hóa ra khi phương thức tôi đang nhấp mở ra, nó thực sự trượt xuống trang. Tùy thuộc vào thời điểm selen chờ mẫu thực tế của DOM, ngoại lệ có thể được ném nếu nó bắt được phương thức khi nó đang di chuyển.
Levi Noecker

3

Tôi đã gặp điều này bởi vì một hộp thoại tải về yếu tố này. Tôi đơn giản giải quyết nó bằng cách thêm một sự chờ đợi trước khi làm việc với phần tử này.

try {
        Thread.sleep((int) (3000));
    } catch (InterruptedException e) {
        //
        e.printStackTrace();
    }

Hy vọng điều này giúp đỡ!


3

Giải thích về thông báo lỗi :

Thông báo lỗi chỉ đơn giản nói rằng phần tử bạn muốn nhấp vào hiện diện, nhưng nó không hiển thị. Nó có thể được bao phủ bởi một cái gì đó hoặc tạm thời không nhìn thấy.

Có thể có nhiều lý do tại sao phần tử không thể nhìn thấy trong thời điểm thử nghiệm. Vui lòng phân tích lại trang của bạn và tìm giải pháp thích hợp cho trường hợp của bạn.

Giải pháp cho trường hợp cụ thể :

Trong trường hợp của tôi, lỗi này xảy ra, khi một chú giải công cụ của phần tử màn hình tôi vừa nhấp vào, đang bật lên phần tử tôi muốn nhấp vào tiếp theo. Def Focus là một giải pháp tôi cần.

  • Giải pháp nhanh làm thế nào để làm mất nét sẽ là nhấp vào một số yếu tố khác trong một phần khác của màn hình có "không có gì". không có gì xảy ra sau một hành động nhấp chuột.
  • Giải pháp thích hợp sẽ là gọi element.blur()phần tử bật ra tooltip, điều này sẽ khiến tooltip biến mất.

3

Lý do cho lỗi này là do phần tử mà bạn đang cố gắng không nằm trong chế độ xem (khu vực mà người dùng nhìn thấy) của trình duyệt. Vì vậy, cách để khắc phục điều này là bằng cách cuộn đến phần tử mong muốn trước rồi thực hiện nhấp chuột.

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)')
}

2

Trả lời của Tony Lâmpada, nhận xét # 27 thực sự đã giải quyết vấn đề cho tôi, ngoại trừ việc nó cung cấp mã Java và tôi cần Python. Đây là một hàm Python cuộn đến vị trí của phần tử và sau đó nhấp vào nó.

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()

Điều này đã giải quyết vấn đề cho tôi trong Chrome 34.0. Nó không gây hại trong Firefox 28.0 và IE 11; những trình duyệt đó không phải là vấn đề, nhưng di chuyển đến vị trí của phần tử trước khi nhấp vào nó vẫn không phải là điều xấu.


2

Có thể đó không phải là giải pháp thực sự sạch nhưng nó hoạt động:

try:
    el.click()
except WebDriverException as e:
    if 'Element is not clickable at point' in e.msg:
        self.browser.execute_script(
            '$("{sel}").click()'.format(sel=el_selector)
        )
    else:
        raise

2

Tôi đã gặp lỗi này vì tôi đã thử nghiệm di chuột và sau đó cần nhấp vào liên kết bên dưới chú giải công cụ. Giải pháp là thêm page.find('.sp-logo').hovertrước click_linkđể đưa tooltip ra khỏi đường đi.


2

Thật buồn cười, tất cả thời gian tôi dành cho việc xem xét các câu trả lời khác nhau, không ai từng thử điều hiển nhiên, tất nhiên, tôi cũng không. Nếu trang của bạn có cùng một id được sử dụng nhiều lần, như của tôi, ("newButton",) và trang bạn muốn không phải là trang đầu tiên được tìm thấy, thì rất có thể bạn sẽ gặp lỗi này. Điều dễ nhất để làm (C #):

var testIt = driver.FindElements(By.Id("newButton"));

Lưu ý đó là FindElements, không phải FindEuity.

Và sau đó kiểm tra để xem có bao nhiêu kết quả đã trở lại từ việc truy xuất. Nếu đó là cái thứ hai, thì bạn có thể sử dụng:

testit[1].Click();

Hoặc lấy id sử dụng lại bất cứ ai để sửa chúng.


Nếu điều này là do có nhiều nút theo ID đó và chỉ có một nút được hiển thị tại một thời điểm, thì một giải pháp ưu việt liên quan đến việc sử dụng LINQ để tìm phần tử đầu tiên hiển thị (nối .First(x => x.Visible)vào lệnh gọi FindElements) và nhấp vào đó nếu nó không rỗng.
Sean Duggan

2

Sau khi thử nghiệm tất cả các đề xuất được đề cập, không có gì làm việc. Tôi đã tạo mã này. Nó hoạt động, nhưng không đẹp

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();
            }
        }
    }
}

2

Tôi thực hiện một loại vũ lực nhấp chuột và nó hoạt động với tôi.

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

2

Nếu bạn đã jQuerytải trên trang, bạn có thể thực thi lệnh javascript sau:

"$('#" + element_id + "').click()"

Ví dụ sử dụng trình thực thi python:

driver.execute_script("$('#%s').click()" % element_id)

1

Tôi có cùng một vấn đề và nó được gây ra bởi một xung đột id giữa div và liên kết bên trong div. Vì vậy, trình điều khiển đã nhấp vào div thay vì liên kết mà tôi muốn. Tôi đã thay đổi id id và nó hoạt động đúng.

Trước:

<div id="logout"><a id="logout" href="logoutLink">logout</a></div>

Sau:

<div id="differentId"><a id="logout" href="logoutLink">logout</a></div>

Không ngạc nhiên mà gây ra vấn đề cho bạn. Chỉ nên có một id trên một trang. Đó là tháo gỡ thiết kế xấu không phải là một cách giải quyết.
Dave Lawrence

1

Trong Drupal khi sử dụng Selenium :

    // 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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.