การดีบักข้อผิดพลาด“ องค์ประกอบไม่สามารถคลิกได้ที่จุด” ข้อผิดพลาด


396

ฉันเห็นสิ่งนี้เฉพาะใน Chrome

ข้อความแสดงข้อผิดพลาดทั้งหมดอ่าน:

"org.openqa.selenium.WebDriverException: องค์ประกอบไม่สามารถคลิกได้ที่จุด (411, 675) องค์ประกอบอื่น ๆ จะได้รับการคลิก: ... "

องค์ประกอบที่ 'จะได้รับการคลิก' คือด้านข้างขององค์ประกอบที่เป็นปัญหาไม่ใช่ด้านบนของมันและไม่ทับซ้อนกันไม่ย้ายไปมารอบหน้า

ฉันลองเพิ่มออฟเซ็ตแล้ว แต่ก็ไม่ได้ผล รายการอยู่ในหน้าต่างที่แสดงโดยไม่จำเป็นต้องเลื่อน


2
คุณรอให้หน้าโหลดหรือไม่ องค์ประกอบอื่นอาจทับซ้อนกันในขณะที่หน้ากำลังโหลดหรือไม่
Herokiller

55
เรื่องสั้นสั้น ๆ สำหรับผู้ที่เพิ่งมาถึง - องค์ประกอบไม่สามารถมองเห็นได้บนหน้าและดังนั้นจึงไม่สามารถคลิกได้ คุณจำเป็นต้องเลื่อนมุมมองโดยการปล่อยหน้าต่าง
Chris B. Behrens

67
@ ChrisB.Behrens นี่ไม่ใช่กรณีเสมอไป ข้อผิดพลาดเฉพาะนี้ยังสามารถให้ได้เมื่อองค์ประกอบถูกครอบคลุมโดยองค์ประกอบอื่น ฉันมีข้อยกเว้นนี้เมื่อพยายามคลิกปุ่มที่เป็นองค์ประกอบอื่นที่มีตำแหน่งคงที่
Martin Cassidy

4
Chromedriver ไม่เพียง แต่มีปัญหาเดียวกันกับ Firefox ฉันแก้ไขปัญหาโดยใช้ความล่าช้าเพื่อรอจนกว่าหน้าจะโหลดซ้ำทั้งหมดตามที่ผู้อื่นแนะนำด้านบน
codervince

5
ฉันคิดว่านี่เป็นคำแนะนำที่ผิดอย่างยิ่งที่จะปล่อย scrollTo หรือรอสักครู่ ดูเหมือนว่าอัลกอริทึมของการคลิกซีลีเนียมคือ: 1. คำนวณตำแหน่งองค์ประกอบ 2. เลื่อนไปที่ตำแหน่งนี้ (ดังนั้นคุณไม่จำเป็นต้องออกด้วยตัวคุณเอง) 3. คลิกที่ตำแหน่งนี้ (ยกเว้นมาจากการยืนยันล่าสุดที่ตรวจสอบองค์ประกอบที่อยู่ในนี้ ตำแหน่งก่อนที่จะส่งเหตุการณ์การคลิกจริง) คำแนะนำของฉันคือ: 1. ตรวจสอบว่าองค์ประกอบอยู่ในวิวพอร์ตของคุณหรือไม่ 2. ตรวจสอบว่าองค์ประกอบถูกครอบคลุมโดยองค์ประกอบอื่น ๆ (เช่นเมนูเหนียว) ซ่อนพวกเขาหากมีหรือเลื่อนด้วยตนเองก่อนคลิกโดยไม่ต้องพึ่งพา builtin scrollTo
Vitalik Verhovodov

คำตอบ:


325

ปัญหานี้เกิดจาก 3 ประเภทต่อไปนี้:

1. องค์ประกอบคลิกมองไม่เห็น

ใช้Actionsหรือ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));

จากนั้นคลิกที่องค์ประกอบ


52
มีสาเหตุที่สามประเภทซึ่งองค์ประกอบของคุณถูกห่อหุ้มด้วย div หรือ span สามารถโหลดหน้าเว็บได้อย่างสมบูรณ์และอยู่ในวิวพอร์ตอย่างสมบูรณ์ แต่ Chromedriver จะปฏิเสธที่จะคลิกโดยที่ webdriver สำหรับ FF และ IE ไม่มีปัญหา มนุษย์จริงไม่มีเงื่อนงำที่มีอยู่และเบราว์เซอร์ไม่สนใจเมื่อคุณคลิกมันในฐานะมนุษย์ การเคลื่อนที่ไปมาหรือรอไม่ช่วยแก้ปัญหานี้ อาจหลีกเลี่ยง Chrome / Chromedriver หรือเขียน HTML ของหน้าใหม่ดูเหมือนจะเป็นตัวเลือกเดียวสำหรับผู้ใช้ในกรณีที่ 3
Don Simon

54
@ DonSimon ฉันมีปัญหาเดียวกับที่คุณทำ ฉันสามารถรับมันได้โดยใช้. ส่งคีย์ (คีย์. ผลตอบแทน) แทน. คลิก สิ่งนี้ใช้ได้กับฉันใน Chrome ที่ฉันมีปัญหานี้และใน Firefox ที่ฉันมีปัญหาที่คล้ายกันในลิงก์นี้โดยเฉพาะ
Peter Bernier

17
วิธีการแก้ปัญหาที่แนะนำโดย @PeterBernier ทำงานได้ดีในกรณีที่องค์ประกอบถูกห่อใน div หรือ a span ใน Python ฉันใช้. send_keys ('\ n') เพื่อจำลองการคลิกและแก้ไขปัญหาใน Chrome
GJ

4
หากองค์ประกอบถูกซ่อนไว้โดยองค์ประกอบ div รหัสต่อไปนี้จะแก้ไขได้ executeJavascript ("อาร์กิวเมนต์ [0] .click ();", selenium.findElement (locator));
EsotericNonsense

นอกจากนี้คุณยังสามารถรอให้องค์ประกอบคลิกได้ wait.Until (ExpectedConditions.ElementToBeClickable (webElement));
Chielus

67

นอกจากนี้คุณยังสามารถใช้การคลิก JavaScript และการเลื่อนจะไม่จำเป็น

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

5
เหลือเชื่อ! ฉันสงสัยว่าทำไมซีลีเนียมไม่ได้ทำลายวิธีการคลิก () ที่พวกเขาให้ไว้เนื่องจากมีเงื่อนไขว่า isDisplayed () และ isEnabled () ไม่เพียงพอที่จะคลิกที่องค์ประกอบและดูเหมือนว่ามีวิธีแก้ปัญหาเดียวเท่านั้น ขอบคุณ!
Giovanni Bitliner

2
+1: นี่เป็นวิธีแก้ปัญหาที่เหมาะกับฉัน actions.MoveToElementไม่ได้ผลสำหรับฉันใน C # และวิธีการเลื่อนอื่น ๆ ดูเหมือนจะเปราะบางเล็กน้อยซึ่งมีโอกาสที่การเลื่อนอาจไม่ถูกต้องเพื่อให้องค์ประกอบดูหรือตำแหน่งขององค์ประกอบในหน้าสามารถเปลี่ยนแปลงได้
ผู้ใช้

1
วิธีนี้เป็นวิธีที่ง่ายที่สุดหากองค์ประกอบไม่ได้อยู่ในมุมมอง แต่มีอยู่บนหน้า
Yashveer Rana

@Giovanni Bitliner พวกเขาไม่ได้ให้วิธีการนี้เพราะมันไม่ใช่สถานการณ์จริงของผู้ใช้ ผู้ใช้ควรรอจนกว่าตัวโหลดจะหายไป ฉันคิดว่านั่นเป็นเรื่องมหัศจรรย์เกี่ยวกับซีลีเนียม
Gideon Mulder

+1 ใช้ได้กับฉันด้วย เพิ่งเพิ่มวิธีการ flwg ในรหัสของฉัน: `โมฆะส่วนตัว jsClick (องค์ประกอบ IWebElement, ไดรเวอร์ IWebDriver) {IJavaScriptExecutor ex = ไดรเวอร์ (IJavaScriptExecutor); ex.ExecuteScript ("อาร์กิวเมนต์ [0] .click ();", องค์ประกอบ); } `เรียกด้วยวิธีนี้: 'jsClick (driver.FindElement (By.XPath (" xpathOfTheElement "))); `
Jeremias

46

ดูเหมือนว่าจะมีข้อผิดพลาดใน Chromedriver (ปัญหาคือว่ามันถูกทำเครื่องหมายว่าจะไม่แก้ไข) -> ลิงค์ GitHub

(วางรางวัลในFreedomSponsorsบางที)

มีวิธีแก้ปัญหาที่แนะนำในความคิดเห็นที่ 27 บางทีมันอาจจะเหมาะกับคุณ -


4
ดูเหมือนว่ายุติธรรม - หากปุ่มไม่ได้อยู่บนหน้าจอก็ไม่สามารถคลิกได้จริง ๆ
Evan Knowles

นี่ไม่ใช่ข้อผิดพลาด นี่เป็นพฤติกรรมที่ตั้งใจและถูกต้อง ตามที่แนะนำอื่น ๆ ถ้าองค์ประกอบอยู่นอกวิวพอร์ต - คุณต้องเลื่อนไปที่องค์ประกอบนั้น
Alex Skrypnyk

ฉันลองใช้ Firefox และพบว่าไม่ได้ให้ข้อผิดพลาดนี้ แต่การคลิกก็ยังคงถูกเพิกเฉย มันกลายเป็น div div ที่มีความสูงเป็นศูนย์ เมื่อได้รับการแก้ไขทั้งสองทำงานได้ดี
dansalmo

35

ฉันมีปัญหาเดียวกันลองใช้วิธีแก้ปัญหาทั้งหมด แต่พวกเขาไม่ได้ผลสำหรับฉัน ในที่สุดฉันก็ใช้สิ่งนี้:

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

หวังว่านี่จะช่วยได้


16

ฉันเคยเห็นสิ่งนี้ในสถานการณ์ที่หน้าต่างซีลีเนียมที่ขับเคลื่อนด้วยซีเล็คเปิดน้อยเกินไป องค์ประกอบที่จะคลิกนั้นออกจากวิวพอร์ตและดังนั้นจึงล้มเหลว

นั่นฟังดูสมเหตุสมผล ... ผู้ใช้จริงจะต้องปรับขนาดหน้าต่างหรือเลื่อนเพื่อให้สามารถดูองค์ประกอบและคลิกที่จริง

หลังจากสั่งให้คนขับซีลีเนียมตั้งค่าขนาดหน้าต่างอย่างเหมาะสมปัญหานี้ก็หายไปสำหรับฉัน webdriver API จะอธิบายไว้ที่นี่


15

ว้าวคำตอบมากมายที่นี่และคำตอบที่ดีมากมาย

ฉันหวังว่าฉันจะเพิ่มสิ่งนี้จากประสบการณ์ของฉัน

ในกรณีของฉันมีคุกกี้ซ้อนทับซ่อนองค์ประกอบในบางครั้ง การเลื่อนไปที่องค์ประกอบยังใช้งานได้ แต่ในความเห็นที่ต่ำต้อยของฉัน (สำหรับกรณีของฉันไม่ใช่ยาครอบจักรวาลสำหรับทุกคน) ทางออกที่ง่ายที่สุดคือเพียงไปแบบเต็มหน้าจอ (ฉันใช้สคริปต์ของฉันที่หน้าจอ 3/4 ของหน้าต่าง)! ดังนั้นเราไปที่นี่:

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

หวังว่าจะช่วย!


13

ทับทิม / Watir-webdriver / โครเมี่ยม

ฉันใช้เคล็ดลับต่อไปนี้และดูเหมือนว่าจะได้ผล:

#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
ปัญหาที่ฉันเห็นคือด้วยแผนที่พื้นที่ ข้อผิดพลาดเป็นเช่นเดียวกับโพสต์ต้นฉบับที่นี่ - div "หน้า" พื้นที่ที่ฉันต้องการคลิก มันไม่ได้เป็นปัญหาการโหลด AJAX / การกำหนดเวลา / หน้าและพื้นที่ในมุมมองแบบเต็ม - ฉันไม่สามารถเลื่อนเพื่อโฟกัสได้ อย่างไรก็ตามการเปลี่ยนวิธีการคลิกของฉันจาก object.click เป็น object.fire_event ("คลิก") ดูเหมือนว่าได้แก้ไขปัญหาให้ฉันแล้ว ฉันทิ้งไว้ในบล็อกเริ่มต้น / กู้ภัยเพื่อที่มันจะไม่ส่งผลกระทบต่อวิธีการคลิก Firefox ตามปกติ
ดัมรีด

วิธีการนี้แก้ปัญหาสำหรับฉันเมื่อมีองค์ประกอบที่มองไม่เห็นในวิวพอร์ต
Jason R. Coombs

13

ฉันก็ต่อสู้กับปัญหานี้เช่นกัน รหัสทำงานได้ดีใน 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 ด้วยบางครั้งจำเป็นต้องใช้การทำงาน เห็นได้ชัดว่าคุณจำเป็นต้องรู้ทิศทางและจำนวนที่คุณต้องไปเพื่อให้ระยะของคุณอาจแตกต่างกันไป แต่ฉันชอบสิ่งนี้กับแฮ็ค javascript ดังนั้นฉันจะโพสต์ไว้ที่นี่ในกรณีที่คนอื่นเห็นว่ามีประโยชน์


สามารถหาตำแหน่งได้
Steve Staple

12

ฉันได้รับข้อผิดพลาดนี้เมื่อรันการทดสอบที่ไม่มีหัวกับ xvfb-run พวกเขาทำงานอย่างไม่มีที่ติในท้องถิ่น ใช้ chrome รุ่นของ webdriver / chromedriver / chrome / java และอื่น ๆ ที่เหมือนกันทั้งหมด

ข้อผิดพลาด 'ไม่แก้ไข' ใน Chromedriver - GitHub Linkชี้ให้เห็นโดย Tony Lâmpadaแนะนำว่าสิ่งนี้อาจเกี่ยวข้องกับสิ่งที่ / ไม่ปรากฏบนหน้าจอ

ข้อความช่วยเหลือสำหรับ xvfb-run แสดงดังต่อไปนี้:

-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" ...

9

เมื่อใช้Protractorสิ่งนี้ช่วยฉัน:

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

8

อันดับแรกลองรับไดรเวอร์ Chrome ล่าสุดและตรวจสอบว่าสามารถแก้ไขปัญหาได้หรือไม่

ในกรณีของฉันมันไม่ได้แก้ไขปัญหา แต่วิธีแก้ปัญหาต่อไปนี้ใช้ได้ผลสำหรับฉันจนถึงตอนนี้ ต่อไปนี้คือรหัส C # แต่คุณสามารถใช้ตรรกะเดียวกันในภาษาของคุณได้ สิ่งที่เราทำที่นี่คือ

ขั้นตอนที่ 1: มุ่งเน้นองค์ประกอบที่ใช้วัตถุซีลีเนียมแอ็คชั่น

ขั้นตอนที่ 2: จากนั้นทำการคลิกที่องค์ประกอบ

ขั้นตอนที่ 3: หากมีข้อยกเว้นเราจะเปิดใช้งาน "คลิก" เหตุการณ์ในองค์ประกอบโดยเรียกใช้สคริปต์ JavaScript ผ่านวิธี "ExecuteScript" ของไดรเวอร์เบราว์เซอร์ซีลีเนียม

คุณสามารถข้ามขั้นตอนที่ 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();");

            }

ฉันมีปัญหาเดียวกันนี้ ขั้นตอนที่ 1 ในการใช้คลาส Actions นั้นยอดเยี่ยม ฉันจะไม่เคยคิดเรื่องนี้ ขอบคุณ!
Conner

ขั้นตอนแรกของคุณคือทางออกที่ดี
Sovandara LENG

7

ฉันทำวิธีนี้โดยอ้างอิงจากคำตอบของ Tony Lâmpada มันใช้งานได้ดีมาก

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

6

ฉันได้รับปัญหาเดียวกันขณะที่เรียกใช้สคริปต์ซีลีเนียมในหลาม นี่คือสิ่งที่ฉันใช้ในการคลิกที่องค์ประกอบ:

from selenium.webdriver.common.action_chains import ActionChains


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

5

ฉันกำลังเผชิญปัญหาที่คล้ายกันซึ่งฉันต้องตรวจสอบสองกล่องกาเครื่องหมายหนึ่งหลังจากที่อื่น ๆ แต่ฉันได้รับข้อผิดพลาดข้างต้นเหมือนกันดังนั้นฉันเพิ่มรอระหว่างขั้นตอนของฉันสำหรับการตรวจสอบช่องทำเครื่องหมาย .... มันทำงานได้ดีและดี นี่คือขั้นตอน: -

  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

เพียงเพิ่มว่านี่ไม่ใช่วิธีที่เหมาะสมในการใช้ไวยากรณ์ของ Gherkin ขั้นตอนควรอยู่ในรูปแบบ "ที่กำหนด - เมื่อ - จากนั้น" และสิ่งเหล่านี้ไม่ควรผสมกัน หากต้องการ "whens" มากกว่านี้หลังจาก "จาก" อาจเป็นกรณีทดสอบแยกต่างหากที่จำเป็น
Floella

5

คุณต้องใช้การโฟกัสหรือเลื่อนบนองค์ประกอบนั้น คุณอาจต้องใช้การรอการอธิบาย

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

3

เห็นได้ชัดว่านี่เป็นผลของข้อผิดพลาด "ไม่แก้ไข" ในไบนารีไดรเวอร์ Chrome

ทางออกหนึ่งที่เหมาะกับฉัน (ไมล์สะสมของเราอาจแตกต่างกัน) สามารถพบได้ในการสนทนาของ Google Group ความคิดเห็น # 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'))

ฉันคาดหวังว่าสิ่งนี้จะใช้งานได้ แต่ถ้าองค์ประกอบที่คุณพยายามคลิกเป็นลิงก์ ...


3

ฉันกำลังเผชิญปัญหาเดียวกันกับclj-webdriver (clojure port ของ Selenium) ฉันเพิ่งแปลวิธีแก้ปัญหาก่อนหน้าเพื่อปิดบังความสะดวก คุณสามารถเรียกใช้ฟังก์ชั่นนี้ก่อนที่จะทำการคลิกหรือเพื่อหลีกเลี่ยงปัญหานั้น

(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

สิ่งนี้อาจเกิดขึ้นหากองค์ประกอบเปลี่ยนตำแหน่งในขณะที่คนขับพยายามคลิก (ฉันเคยเห็นสิ่งนี้กับ IE ด้วย) คนขับรักษาตำแหน่งเริ่มต้น แต่ตามเวลาที่ได้รับจริงคลิกที่ตำแหน่งนั้นจะไม่ชี้ไปที่องค์ประกอบนั้น ไดรเวอร์ FireFox ไม่มีปัญหานี้ BTW ดูเหมือนจะเป็นองค์ประกอบ "คลิก" โดยทางโปรแกรม

อย่างไรก็ตามสิ่งนี้สามารถเกิดขึ้นได้เมื่อคุณใช้ภาพเคลื่อนไหวหรือเพียงแค่เปลี่ยนความสูงขององค์ประกอบแบบไดนามิก (เช่น$("#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;
});

นี่ดูเหมือนจะเป็นสิ่งที่ฉันกำลังประสบอยู่ ฉันได้รับข้อยกเว้น "องค์ประกอบอื่น ๆ จะ ... " เป็นระยะ ๆ แต่ภาพหน้าจอแสดงว่า modal อยู่บนหน้าจอและองค์ประกอบไม่ครอบคลุมและฉันใช้รอก่อนคลิก ปรากฎเมื่อคำกริยาที่ฉันคลิกเปิดขึ้นจริงจะเลื่อนลงมาที่หน้าเว็บ ทั้งนี้ขึ้นอยู่กับว่าเมื่อซีลีเนียมรอตัวอย่างจริง DOM สามารถยกเว้นได้ถ้ามันจับโมดัลในขณะที่มันกำลังเคลื่อนไหว
Levi Noecker

3

ฉันพบสิ่งนี้เพราะกล่องโต้ตอบการโหลดครอบคลุมองค์ประกอบนี้ ฉันแก้มันง่าย ๆ โดยเพิ่มการรอก่อนทำงานกับองค์ประกอบนี้

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

หวังว่าจะช่วยได้!


3

คำอธิบายของข้อผิดพลาด :

ข้อความแสดงข้อผิดพลาดบอกว่าองค์ประกอบที่คุณต้องการคลิกนั้นมีอยู่ แต่ไม่ปรากฏให้เห็น อาจครอบคลุมบางสิ่งหรือชั่วคราวที่มองไม่เห็น

อาจมีหลายสาเหตุที่องค์ประกอบไม่ปรากฏในช่วงเวลาของการทดสอบ โปรดวิเคราะห์หน้าเว็บของคุณอีกครั้งและหาวิธีแก้ไขปัญหาที่เหมาะสมสำหรับกรณีของคุณ

คำตอบสำหรับกรณีเฉพาะ :

ในกรณีของฉันข้อผิดพลาดนี้เกิดขึ้นเมื่อคำแนะนำเครื่องมือขององค์ประกอบหน้าจอที่ฉันเพิ่งคลิกไปปรากฏขึ้นเหนือองค์ประกอบที่ฉันต้องการคลิกถัดไป พร่ามัวเป็นวิธีแก้ปัญหาที่ฉันต้องการ

  • วิธีแก้ปัญหาอย่างรวดเร็วในการปรับโฟกัสอัตโนมัติคือการคลิกองค์ประกอบอื่น ๆ ในส่วนอื่นของหน้าจอซึ่งไม่ตอบสนอง "ไม่มีอะไร" ไม่มีอะไรเกิดขึ้นหลังจากการคลิก
  • วิธีแก้ปัญหาที่เหมาะสมคือการเรียกelement.blur()ใช้องค์ประกอบที่ปรากฏคำแนะนำเครื่องมือซึ่งจะทำให้คำแนะนำเครื่องมือหายไป

3

สาเหตุของข้อผิดพลาดนี้คือองค์ประกอบที่คุณพยายามคลิกไม่ได้อยู่ในวิวพอร์ต (ภูมิภาคที่ผู้ใช้เห็น) ของเบราว์เซอร์ ดังนั้นวิธีที่จะเอาชนะสิ่งนี้คือการเลื่อนไปที่องค์ประกอบที่ต้องการก่อนแล้วจึงทำการคลิก

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

Re คำตอบของ Tony Lâ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; เบราว์เซอร์เหล่านั้นไม่ได้มีปัญหา แต่การเลื่อนไปที่ตำแหน่งขององค์ประกอบก่อนที่จะคลิกมันยังคงไม่เลว


2

อาจไม่ใช่วิธีแก้ปัญหาที่ไม่สะอาด แต่ใช้งานได้:

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

ฉันได้รับข้อผิดพลาดนี้เพราะฉันทดสอบโฮเวอร์แล้วต้องคลิกลิงก์ใต้คำแนะนำเครื่องมือ การแก้ปัญหาคือการเพิ่มpage.find('.sp-logo').hoverก่อนที่click_linkจะได้รับเคล็ดลับเครื่องมือออกไป


2

เป็นเรื่องตลกตลอดเวลาที่ฉันดูการตอบสนองที่หลากหลายไม่มีใครได้ลองอย่างชัดเจนซึ่งแน่นอนว่าฉันก็ไม่ได้เป็นเช่นนั้น หากหน้าของคุณมี ID เดียวกันใช้หลายครั้งเหมือนที่ฉันเคยทำ ("newButton",) และหน้าเว็บที่คุณต้องการไม่ใช่รหัสแรกที่พบคุณจะได้รับข้อผิดพลาดนี้ทุกครั้ง สิ่งที่ง่ายที่สุดที่จะทำ (C #):

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

โปรดทราบว่าเป็น FindElements ไม่ใช่ FindElement

จากนั้นทดสอบเพื่อดูจำนวนผลลัพธ์ที่ได้กลับมาจากการสืบค้น หากเป็นรายการที่สองคุณสามารถใช้:

testit[1].Click();

หรือรับรหัสผู้ใช้ซ้ำเพื่อแก้ไข


หากนี่เป็นเพราะมีหลายปุ่มโดย ID นั้นและแสดงเพียงปุ่มเดียวในแต่ละครั้งโซลูชั่นที่เหนือกว่าเกี่ยวข้องกับการใช้ LINQ เพื่อค้นหาองค์ประกอบแรกที่มองเห็นได้ (ผนวก.First(x => x.Visible)เข้ากับการโทร FindElements) และคลิกที่หากไม่เป็นโมฆะ
ฌอนดักแกน

2

หลังจากทดสอบคำแนะนำที่กล่าวถึงทั้งหมดแล้วก็ไม่มีอะไรทำงาน ฉันทำรหัสนี้ มันใช้งานได้ แต่ไม่สวยงาม

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

ฉันใช้กำลังคลิกอย่างดุร้ายและทำงานได้ดีสำหรับฉัน

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

หากคุณjQueryโหลดในหน้านี้คุณสามารถรันคำสั่ง javascript ต่อไปนี้:

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

ตัวอย่างการใช้ตัวจัดการ python:

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

1

ฉันมีปัญหาเดียวกันและเกิดจากข้อขัดแย้งระหว่าง id และตัวเชื่อมโยงใน div ดังนั้นคนขับจึงคลิกที่ div แทนลิงค์ที่ฉันต้องการ ฉันเปลี่ยนรหัส div และทำงานได้อย่างถูกต้อง

ก่อน:

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

หลังจาก:

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

ไม่แปลกใจเลยที่ทำให้คุณมีปัญหา ควรมีหนึ่ง id บนหน้าเท่านั้น นั่นคือการออกแบบที่ไม่ดีคลี่คลายไม่ได้แก้ปัญหา
เดฟลอเรนซ์

1

ใน 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();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.