"উপাদানটি বিন্দুতে ক্লিকযোগ্য নয়" ত্রুটি ডিবাগ করা


396

আমি এটি কেবল ক্রোমে দেখি।

সম্পূর্ণ ত্রুটি বার্তাটি পড়ে:

"org.openqa.selenium.WebDriverException: এলিমেন্টটি পয়েন্টে ক্লিকযোগ্য নয় (411, 675)। অন্য উপাদানগুলি ক্লিকটি গ্রহণ করবে: ..."

যে উপাদানটি 'ক্লিকটি গ্রহণ করবে' সেগুলি প্রশ্নের মধ্যে থাকা উপাদানটির পাশে রয়েছে, এটির উপরে নয় এবং এটি ওভারল্যাপিং নয়, পৃষ্ঠাটির চারপাশে ঘুরছে না।

আমি একটি অফসেট যুক্ত করার চেষ্টা করেছি, তবে এটিও কার্যকর হয় না। আইটেমটি স্ক্রোলিংয়ের কোনও প্রয়োজন ছাড়াই প্রদর্শিত উইন্ডোতে রয়েছে।


2
আপনি পৃষ্ঠাটি লোড হওয়ার জন্য অপেক্ষা করেন? পৃষ্ঠাটি লোড হওয়ার সময় অন্য উপাদানগুলি এটিকে ওভারল্যাপ করে?
হিরোকিলার

55
কেবল আগতদের জন্য দীর্ঘ গল্প সংক্ষিপ্ত - উপাদানটি পৃষ্ঠাটিতে দৃশ্যমান নয় এবং এটি এখানে ক্লিকযোগ্য নয়। আপনাকে উইন্ডোটি সজ্জিত করে স্ক্রোল করতে হবে M স্ক্রোলটো।
ক্রিস বি বেরেনস

67
@ ChrisB.Behrens এটি সবসময় হয় না। যখন কোনও উপাদান অন্য দ্বারা আচ্ছাদিত হয় তখন এই বিশেষ ত্রুটিটিও দেওয়া যেতে পারে। পোস্ট করার সাথে অন্য উপাদান হিসাবে থাকা একটি বোতামটি ক্লিক করার চেষ্টা করার সময় আমার এই ব্যতিক্রম হয়েছিল।
মার্টিন ক্যাসিডি

4
এটি কেবল ক্রোমড্রাইভারই নয়- ফায়ারফক্সের ক্ষেত্রেও একই সমস্যা ছিল। উপরের অন্যদের পরামর্শ অনুসারে, পৃষ্ঠাটি পুরোপুরি পুনরায় লোড না হওয়া পর্যন্ত অপেক্ষা করতে দেরি প্রয়োগ করে সমস্যাটি সমাধান করেছি।
কোডারভিন্স

5
আমি মনে করি এটি স্ক্রোলটো নির্গত করতে বা কোনও অপেক্ষা করতে একেবারেই ভুল পরামর্শ। সেলেনিয়াম ক্লিকের অ্যালগরিদমটি দেখে মনে হচ্ছে: 1. উপাদান অবস্থানটি গণনা করুন 2. এই অবস্থানের জন্য স্ক্রোল করুন (সুতরাং আপনার নিজের এটি ইস্যু করার দরকার নেই) 3. এই অবস্থানটিতে ক্লিক করুন (ব্যতিক্রমটি সর্বশেষ বক্তব্য থেকে আসে যা পরীক্ষা করে যা উপাদান এতে দাঁড়িয়েছে আসল ক্লিক ইভেন্ট প্রেরণের ঠিক আগে অবস্থান) আমার পরামর্শগুলি হ'ল: 1. উপাদানটি আপনার ভিউপোর্টের ভিতরে রয়েছে কিনা তা পরীক্ষা করুন। ২) উপাদানটি অন্য কোনও দ্বারা আচ্ছাদিত রয়েছে কিনা তা পরীক্ষা করুন (যেমন স্টিকি মেনুগুলি), সেগুলি লুকিয়ে রাখুন বা বিল্টিন স্ক্রোলটোর উপর নির্ভর না করে ক্লিক করার আগে ম্যানুয়ালি স্ক্রোল করুন।
ভাইটালিক ভারহোভাদভ

উত্তর:


325

এটি 3 ধরণের নিম্নলিখিত কারণে ঘটে:

1. উপাদানটি ক্লিক করার জন্য দৃশ্যমান নয়।

ব্যবহার করুন পদক্ষেপ বা JavascriptExecutor এটি ক্লিক করার তৈরীর জন্য।

ক্রিয়া দ্বারা:

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

Actions actions = new Actions(driver);

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

জাভাস্ক্রিপ্টএক্সেক্টর দ্বারা:

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

তারপরে উপাদানটিতে ক্লিক করুন।

উপাদানটি ক্লিক করার আগে পৃষ্ঠাটি সতেজ হয়ে উঠছে।

এই জন্য, পৃষ্ঠাটি কয়েক সেকেন্ড অপেক্ষা করুন।

৩. উপাদানটি ক্লিকযোগ্য তবে এর উপরে একটি স্পিনার / ওভারলে রয়েছে

ওভারলে অদৃশ্য হওয়া পর্যন্ত নীচের কোডটি অপেক্ষা করবে

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

WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);

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

তারপরে উপাদানটিতে ক্লিক করুন।


52
তৃতীয় ধরণের কারণ রয়েছে, এটি হ'ল আপনার উপাদানটি ডিভ বা স্প্যানে আবৃত। পৃষ্ঠাটি পুরোপুরি লোড হতে পারে এবং সম্পূর্ণরূপে ভিউপোর্টের মধ্যে থাকা যায় তবে Chromedriver এটি ক্লিক করতে অস্বীকার করবে, যেখানে এফএফ এবং আইইয়ের ওয়েবড্রাইভারের কোনও সমস্যা নেই। প্রকৃত মানুষের কোনও স্প্যান নেই যে স্প্যানটি বিদ্যমান, এবং আপনি যখন একজন মানুষ হিসাবে আসলে এটি ক্লিক করেন তখন ব্রাউজারটি যত্ন করে না। না ঘুরে বেড়ানো, না অপেক্ষা এই সমস্যার সমাধান করবে না; হয় ক্রোম / ক্রোমড্রাইভার এড়িয়ে চলুন, বা পৃষ্ঠার এইচটিএমএলটি পুনরায় লেখুন 3. ক্ষেত্রে লোকদের জন্য একমাত্র বিকল্প বলে মনে হচ্ছে
ডন সাইমন

54
@ ডনসিমন আমার একই সমস্যা ছিল যা আপনি করেছেন। আমি .CindKes এর পরিবর্তে .SendKeys (কী। রিটারন) ব্যবহার করে এটি ঘিরে ফেলতে সক্ষম হয়েছি। এটি ক্রোমে যেখানে আমার এই সমস্যাটি ছিল এবং ফায়ারফক্সে যেখানে এই নির্দিষ্ট লিঙ্কটিতে আমার সাথে অনুরূপ অন্য একটি সমস্যা রয়েছে (অ্যাঙ্কর একটি ডিভের মধ্যে আবৃত) ছিল সে ক্ষেত্রে এটি আমার জন্য কাজ করেছিল।
পিটার বার্নিয়ার

17
@ পিটারবার্নিয়ার প্রস্তাবিত সমাধান সেই ক্ষেত্রে কার্যকরভাবে কাজ করে যেখানে উপাদানটি ডিভ বা স্প্যানে আবৃত থাকে। পাইথনে আমি ক্লিকের অনুকরণ এবং ক্রোমে সমস্যাটি নিয়ে কাজ করার জন্য .send_keys ('\ n') ব্যবহার করি।
জিজে

4
যদি কোনও উপাদান একটি ডিভ উপাদান দ্বারা গোপন থাকে তবে নিম্নলিখিত কোডটি এটি ঠিক করে। এক্সিকিউট জাভাস্ক্রিপ্ট ("আর্গুমেন্ট [0] .ক্লিক ();", সেলেনিয়াম.ফাইন্ড এলিমেন্ট (লোকেটার));
এসোটেরিকনসেনস

আপনি উপাদানটি ক্লিকযোগ্য হওয়ার জন্য অপেক্ষা করতে পারেন। wait.Until (ExpectedConditions.ElementToBeClickable (webElement));
চিয়েলাস

67

আপনি জাভাস্ক্রিপ্ট ক্লিক ব্যবহার করতে পারেন এবং তখন স্ক্রোলিংয়ের প্রয়োজন হবে না।

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

5
অবিশ্বাস্য! আমি অবাক হই যে কেন সেলেনিয়াম তারা প্রদত্ত ক্লিক () পদ্ধতিটি ট্র্যাশ করে না কেন, এমন একটি শর্ত রয়েছে যেটিতে ডিসপ্লেড () এবং isEn सक्षम () কোনও উপাদানটিতে ক্লিক করার জন্য পর্যাপ্ত নয় এবং এটি কেবলমাত্র একটি সমাধান বলে মনে হয়। ধন্যবাদ!
জিওভান্নি বিটলিনার

2
+1: এটি আমার জন্য কার্যকর সমাধান solution actions.MoveToElementসি # তে আমার পক্ষে কাজ করেনি এবং অন্যান্য স্ক্রোলিং সমাধানগুলি কিছুটা ভঙ্গুর বলে মনে হয়েছিল যে স্ক্রোলিংটি উপাদানটিকে সঠিকভাবে নজরে না আনতে পারে বা পৃষ্ঠায় উপাদানটির অবস্থান পরিবর্তন করতে পারে a
ব্যবহারকারী

1
এই সমাধানটি যদি উপাদানটি
নজরে

@ জিওভান্নি বিটলাইনার তারা এই পদ্ধতিটি সরবরাহ করে না কারণ এটি সত্যিকারের ব্যবহারকারী পরিস্থিতি নয়। ব্যবহারকারীদের লোডার অদৃশ্য হওয়া পর্যন্ত অপেক্ষা করতে হবে। আমি সেলেনিয়াম সম্পর্কে একটি বিস্ময়কর জিনিস thats মনে করি।
মুল্ডার

+1 আমার পক্ষেও কাজ করেছে। আমার কোডটিতে সবেমাত্র ফ্লাওয়ার পদ্ধতি তৈরি করা হয়েছে: `বেসরকারী শূন্যতা jsClick (IWebElement উপাদান, IWebDriver ড্রাইভার) {IJavaScriptExecutor ex = (IJavaScriptExecutor) ড্রাইভার; ex.ExecuteScript ("আর্গুমেন্ট [0]। ক্লিক ();", উপাদান); this this এইভাবে অনুরোধ করা হয়েছে: 'জেএসক্লিক (ড্রাইভার.ফাইন্ড এলিমেট (বাই। এক্সপাথ ("xpathOfTheElement")))); `
জেরেমিয়াস

46

এর জন্য ক্রোমড্রাইভারে একটি ত্রুটি রয়েছে বলে মনে হচ্ছে (সমস্যাটি এটি ঠিক করা হবে না হিসাবে চিহ্নিত করা হয়েছে) -> গিটহাব লিংক

( সম্ভবত ফ্রিডম স্পনসরগুলিতে একটি অনুগ্রহ রাখুন ?)

মন্তব্য # 27 এ প্রস্তাবিত একটি কার্যতালিকা রয়েছে। সম্ভবত এটি আপনার জন্য কাজ করবে-


4
দেখতে মোটামুটি মনে হচ্ছে - বোতামটি যদি স্ক্রিনে না থাকে তবে এটি সত্যিই ক্লিকযোগ্য নয়।
ইভান নোলস

এটি একটি বাগ না। এটি উদ্দেশ্যমূলক আচরণ এবং এটি সঠিক। অন্যান্য প্রস্তাবিত হিসাবে, উপাদানটি ভিউপোর্টের বাইরে থাকলে - আপনাকে এটিতে স্ক্রোল করতে হবে।
অ্যালেক্স স্ক্রাইপনিক

আমি ফায়ারফক্স চেষ্টা করে দেখেছি এটি এই ত্রুটিটি দেয় নি, তবুও ক্লিকটি উপেক্ষা করা হয়েছিল। এটি প্রমাণিত হয়েছিল যে পিতামাতার দ্বার উচ্চতা শূন্য ছিল। একবার ঠিক হয়ে গেলে উভয়ই ঠিকঠাক কাজ করেছিল।
ডানসালমো

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

সেলেনিয়াম চালিত ক্রোম উইন্ডোটি খুব ছোট খোলার সময় আমি এটিকে দেখেছি। ক্লিক করার জন্য উপাদানটি ভিউপোর্টের বাইরে ছিল এবং তাই এটি ব্যর্থ হয়েছিল।

এটি যৌক্তিক মনে হচ্ছে ... আসল ব্যবহারকারীকে হয় হয় উইন্ডোটির আকার পরিবর্তন করতে হবে বা স্ক্রোল করতে হবে যাতে উপাদানটি দেখতে পাওয়া যায় এবং বাস্তবে এটিতে ক্লিক করতে হয়।

উইন্ডো আকারটি যথাযথভাবে সেট করার জন্য সেলেনিয়াম ড্রাইভারকে নির্দেশ দেওয়ার পরে এই সমস্যাগুলি আমার কাছে চলে গেল। ওয়েবড্রাইভার এপিআই এখানে সজ্জিত করা হয়েছে


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
আমি যে সমস্যাটি দেখছিলাম তা হ'ল একটি অঞ্চল মানচিত্রের সাথে। ত্রুটিটি এখানে মূল পোস্টের মতোই ছিল - যে অঞ্চলটিতে ক্লিক করার দরকার ছিল তার সামনে একটি ডিভ "। এটি কোনও এএএএক্সএক্স / টাইমিং / পৃষ্ঠা লোড ইস্যু নয় এবং অঞ্চলটি পুরো দৃষ্টিতে ছিল - আমি এটিতে ফোকাস করতে এমনকি স্ক্রোলও করতে পারিনি। তবে, আমার ক্লিকের পদ্ধতিটি অবজেক্ট থেকে ক্লিক করুন অবজেক্টে ক্লিক করুন fire অগ্নি_সামগ্রী ("ক্লিক করুন") আমার কাছে সমস্যাটি সমাধান করেছে বলে মনে হচ্ছে। আমি এটিকে একটি প্রাথমিক / উদ্ধারকেন্দ্রের মধ্যে রেখে দিয়েছি যাতে এটি সম্ভবত ফায়ারফক্স কীভাবে সাধারণভাবে ক্লিক করছে তা প্রভাবিত করে না।
আদম রিড

ভিউপোর্টে যখন উপাদান উপস্থিত ছিল না তখন এই পদ্ধতির বিষয়টি আমার পক্ষে কাজ করেছিল।
জেসন আর। কম্বস

13

আমিও এই সমস্যা নিয়ে কুস্তি করেছিলাম। কোড এফএফ-তে সূক্ষ্মভাবে কাজ করে, ক্রোমে ব্যর্থ। আমি যা করার চেষ্টা করছিলাম সেটি ছিল একটি টিকবাক্স ক্লিক করা - এটি যদি না দেখানো হত তবে আমি দেখতে স্ক্রোল করে তারপরে ক্লিক করব। এমনকি ক্রোমে দেখার জন্য স্ক্রোল করা কাজ করে, কেবল টিকবক্সের নীচে কয়েকটি পিক্সেল দৃশ্যমান ছিল না তাই ওয়েবড্রাইভার এটিতে ক্লিক করতে অস্বীকার করেছিল।

আমার কাজটি হ'ল:

WebElement element = _sectorPopup.findElement(...);

((Locatable) element).getCoordinates().inViewPort();
try {
    element.click();
} catch (Exception e) {
    new Actions(getWebDriver()).sendKeys(Keys.PAGE_DOWN).perform();
    element.click();
}

ক্রোমেরও পাঠানো কীগুলির সাথে সমস্যা রয়েছে, অ্যাকশনগুলি ব্যবহার করা কখনও কখনও প্রয়োজনীয় হয়। স্পষ্টতই, আপনাকে জানা উচিত যে কোন দিক এবং আপনার কতটা যেতে হবে তাই আপনার মাইলেজটি ভিন্ন হতে পারে। তবে আমি এটি জাভাস্ক্রিপ্ট হ্যাকের চেয়ে বেশি পছন্দ করি, সুতরাং অন্য কেউ যদি এটির কাজে লাগে সে ক্ষেত্রে আমি এখানে এটি পোস্ট করছি।


লোকেশনযোগ্য হ্রাস করা হয়।
স্টিভ স্ট্যাপল

12

এক্সভিএফবি-রান দিয়ে হেডলেস পরীক্ষা চালানোর সময় আমি এই ত্রুটিটি পেয়েছিলাম। তারা স্থানীয়ভাবে নির্বিঘ্নে কাজ করছিল। ক্রোম ব্যবহার করে, ওয়েবড্রাইভার / ক্রোমড্রাইভার / ক্রোম / জাভা ইত্যাদি সংস্করণ সমস্ত অভিন্ন।

ক্রোমড্রাইভারে 'ঠিক করবে না' বাগ - টনি লম্প্পা দ্বারা নির্দেশিত গিটহাব লিংক প্রস্তাব দিয়েছে এটি স্ক্রিনে যা দৃশ্যমান / অপসারণযোগ্য তা সম্পর্কিত হতে পারে।

এক্সভিএফবি-রানের জন্য সহায়তা বার্তা নিম্নলিখিতটি দেখায়:

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

এক্সভিএফবি-র জন্য রেজোলিউশন পরিবর্তন করা ত্রুটিটি দূরে সরিয়ে নিয়েছে:

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

9

প্রোটেক্টর ব্যবহার করার সময় এটি আমাকে সহায়তা করেছিল:

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

8

প্রথমে সর্বশেষতম ক্রোম ড্রাইভার পাওয়ার চেষ্টা করুন এবং এটি সমস্যার সমাধান করে কিনা তা পরীক্ষা করে দেখুন।

আমার ক্ষেত্রে, এটি সমস্যার সমাধান করেনি। তবে, নিম্নলিখিত সমাধানটি এখনও পর্যন্ত আমার পক্ষে কাজ করেছে। নিম্নলিখিত সি # কোডটি রয়েছে তবে আপনি আপনার নির্দিষ্ট ভাষায় একই যুক্তিটি অনুসরণ করতে পারেন। আমরা এখানে যা করি তা হ'ল

পদক্ষেপ 1: সেলেনিয়াম অ্যাকশন অবজেক্ট ব্যবহার করে উপাদানটিতে ফোকাস করুন,

পদক্ষেপ 2: তারপরে উপাদানটিতে ক্লিক করুন

পদক্ষেপ 3: যদি কোনও ব্যতিক্রম থাকে, তবে আমরা সেলেনিয়াম ব্রাউজার ড্রাইভারের "এক্সিকিউটিস্ক্রিপ্ট" পদ্ধতির মাধ্যমে জাভাস্ক্রিপ্ট স্ক্রিপ্টটি সম্পাদন করে উপাদানটিতে একটি জাভাস্ক্রিপ্ট "ক্লিক" ইভেন্টটি ট্রিগার করি।

আপনি পদক্ষেপ 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 দুর্দান্ত কাজ করে। আমি এই সম্পর্কে কখনও চিন্তা করতে হবে না। ধন্যবাদ!
কনভেনার

আপনার প্রথম পদক্ষেপটি একটি দুর্দান্ত সমাধান।
সোভানদারা লেনগ

7

টনি লম্প্পার উত্তরের একটি মন্তব্যের ভিত্তিতে আমি এই পদ্ধতিটি তৈরি করেছি। এটি খুব ভাল কাজ করে।

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

আমি একইরকম সমস্যার মুখোমুখি হয়েছি যখন আমাকে একের পর এক দুটি চেক বাক্স চেক করতে হবে B তবে আমি একই ধরণের ত্রুটি পেয়ে যাচ্ছিলাম nceতখন আমি চেকবক্সগুলি চেক করার জন্য আমার পদক্ষেপগুলির মধ্যে অপেক্ষা করলাম .... এটি দুর্দান্ত এবং দুর্দান্ত। পদক্ষেপ এখানে:

  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

কেবল যোগ করা যে এটি ঘেরকিন সিনট্যাক্স ব্যবহারের সঠিক উপায় নয়। পদক্ষেপগুলি "প্রদত্ত - কখন - তখন" আকারে থাকা উচিত এবং এগুলি মিশ্রিত হওয়া উচিত নয়। যদি "তারপর" এর পরে আরও "কখন" প্রয়োজন হয় তবে সম্ভবত পৃথক পরীক্ষার কেস প্রয়োজন হয়।
ফ্ল্লোলা

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

স্পষ্টতই এটি ক্রোম ড্রাইভার বাইনারিতে "উইন্ট ফিক্স" বাগের ফলাফল।

আমার জন্য কাজ করা একটি সমাধান (আমাদের মাইলেজ মে ভেরি) এই গুগল গ্রুপ আলোচনায় পাওয়া যাবে, মন্তব্য # 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 ( "সূরা")।।);

আমার ক্ষেত্রে, আমি পাইথন ব্যবহার করছি, সুতরাং একবার যখন আমি পছন্দসই উপাদানটি পেয়েছিলাম তখন আমি কেবল ব্যবহার করি used

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

আমি কেবল এটির কাজ করার আশা করব, তবে আপনি যে উপাদানটি ক্লিক করার চেষ্টা করছেন তা যদি কোনও লিঙ্ক হয় ...


3

আমি ক্লজ-ওয়েবড্রাইভার (সেলেনিয়ামের ক্লোজার পোর্ট) নিয়ে একই সমস্যার মুখোমুখি হয়েছি । আমি সুবিধার জন্য ক্লোজারে কেবল পূর্ববর্তী সমাধানটি অনুবাদ করেছি। ক্লিক বা এই সমস্যাটি এড়াতে যা কিছু করার আগে আপনি এই ফাংশনটিতে কল করতে পারেন।

(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 এর সাথেও দেখেছি)। ড্রাইভার প্রাথমিক অবস্থান ধরে রাখে কিন্তু সময় আসলে এটি ক্লিক করার সময়, সেই অবস্থানটি আর সেই উপাদানটির দিকে নির্দেশ করে না। ফায়ারফক্স ড্রাইভারটির এই সমস্যাটি বিটিডাব্লু নেই, স্পষ্টতই এটি প্রোগ্রামিকভাবে উপাদানগুলিকে "ক্লিক করে"।

যাইহোক, অ্যানিমেশনগুলি ব্যবহার করার সময় বা উপাদানগুলির উচ্চতা পরিবর্তনশীলভাবে (উদাহরণস্বরূপ $("#foo").height(500)) পরিবর্তিত হয়ে গেলে এটি ঘটতে পারে । আপনাকে অবশ্যই নিশ্চিত করতে হবে যে উপাদানগুলির উচ্চতা "স্থির" হওয়ার পরে আপনি কেবলমাত্র ক্লিক করেন। আমি এমন কোড দিয়ে শেষ করেছি যা দেখতে (সি # বাইন্ডিং) এর মতো দেখায়:

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

এটি আমি যা অনুভব করছি তা হ'ল। আমি মাঝেমধ্যে ওপি'র "অন্যান্য উপাদানটি ..." ব্যতিক্রম পাই, তবে স্ক্রিনশটগুলি দেখায় যে মডেলটি স্ক্রিনে রয়েছে এবং উপাদানটি আচ্ছাদিত নয় এবং ক্লিক করার আগে আমি অপেক্ষাগুলি ব্যবহার করি। যখন আমি যে মডেলটি ক্লিক করছি সেটি খুললে এটি পৃষ্ঠার নীচে স্লাইড হয় Turn যখন সেলেনিয়াম প্রকৃত নমুনাগুলির DOM অপেক্ষা করে তার উপর নির্ভর করে, মডেলটি যখন এটি চলছিল তখন ধরা পড়লে ব্যতিক্রম ছুঁড়ে ফেলা যায়।
লেভি নোকার

3

আমি এটি পূরণ করেছি কারণ এই উপাদানটিতে একটি লোডিং ডায়ালগ coverাকা পড়েছে। আমি এই উপাদানটির সাথে কাজ করার আগে একটি অপেক্ষার যোগ করে সহজভাবে সমাধান করি।

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

এই সাহায্য আশা করি!


3

ত্রুটি বার্তার ব্যাখ্যা :

ত্রুটি বার্তায় সহজভাবে বলা হয়েছে যে আপনি যে উপাদানটি ক্লিক করতে চান তা উপস্থিত থাকলেও এটি দৃশ্যমান নয়। এটি এমন কোনও কিছু দ্বারা আচ্ছাদিত হতে পারে বা অস্থায়ীভাবে দৃশ্যমান নয়।

পরীক্ষার মুহুর্তে উপাদানটি দৃশ্যমান না হওয়ার অনেক কারণ থাকতে পারে। দয়া করে আপনার পৃষ্ঠাটি পুনরায় বিশ্লেষণ করুন এবং আপনার ক্ষেত্রে যথাযথ সমাধান পান।

নির্দিষ্ট ক্ষেত্রে সমাধান :

আমার ক্ষেত্রে, এই ত্রুটিটি দেখা দেয়, যখন আমি স্রেফ ক্লিক করেছি এমন পর্দার উপাদানটির একটি সরঞ্জামদণ্ডটি আমি যে উপাদানটি পরবর্তী ক্লিক করতে চেয়েছিলাম সেটিকে পপ করে। ডিফোকস হ'ল আমার একটি সমাধান needed

  • কীভাবে ডিফোকস করবেন তাড়াতাড়ি সমাধান হ'ল পর্দার অন্য অংশে কিছু অন্যান্য উপাদানতে ক্লিক করা যা "কিছুই না" শ্রদ্ধা করে। ক্লিক অ্যাকশনের পরে কিছুই হয় না।
  • সঠিক সমাধানটিelement.blur() হ'ল টুলটিপটি পপিং করার উপাদানগুলিকে আহ্বান জানানো হবে, যা সরঞ্জামদণ্ডকে বিলুপ্ত করবে।

3

এই ত্রুটির কারণ হ'ল আপনি যে উপাদানটি ক্লিক করার চেষ্টা করছেন সেটি ব্রাউজারের ভিউপোর্টে (ব্যবহারকারী দ্বারা দেখা অঞ্চল) নয়। সুতরাং এটি কাটিয়ে ওঠার উপায় হ'ল প্রথমে পছন্দসই উপাদানটিতে স্ক্রোল করা এবং তারপরে ক্লিক সম্পাদন করা।

javascript:

async scrollTo (webElement) {
    await this.driver.executeScript('arguments[0].scrollIntoView(true)', webElement)
    await this.driver.executeScript('window.scrollBy(0,-150)')
}

জাভা:

public void scrollTo (WebElement e) {
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    js.executeAsyncScript('arguments[0].scrollIntoView(true)', e)
    js.executeAsyncScript('window.scrollBy(0,-150)')
}

2

রে টনি লোম্পাদার উত্তর, মন্তব্য # 27 সত্যিই আমার জন্য সমস্যাটি সমাধান করেছিল, এটি জাভা কোড সরবরাহ করে এবং আমার পাইথনের প্রয়োজন ছিল। এখানে একটি পাইথন ফাংশন যা উপাদানটির অবস্থানটিতে স্ক্রোল করে এবং তারপরে ক্লিক করে।

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

এটি আমার জন্য ক্রোম 34.0 এ সমস্যার সমাধান করেছে। এটি ফায়ারফক্স 28.0 এবং আইই 11 তে কোনও ক্ষতি করেনি; এই ব্রাউজারগুলি সমস্যায় পড়ে না, তবে এটি ক্লিক করার আগে উপাদানটির অবস্থানের দিকে স্ক্রোল করা কোনও খারাপ জিনিস নয় isn't


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

এটি মজার বিষয়, আমি যতক্ষণ না বিভিন্ন প্রতিক্রিয়াগুলি দেখার জন্য ব্যয় করেছি, কেউই সুস্পষ্টরূপে চেষ্টা করে নি, অবশ্যই কোনটি আমার ছিল না। যদি আপনার পৃষ্ঠায় একই আইডি একাধিকবার ব্যবহার করা হয়েছে, যেমনটি আমার মতো হয়েছিল, ("নিউ বাটন",) এবং আপনি যা চান এটি প্রথমটি খুঁজে পাওয়া যায় নি, তবে আপনি সম্ভবত এই ত্রুটিটি পেয়ে যাবেন। সবচেয়ে সহজ কাজ (সি #):

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

নোট করুন এটি ফাইন্ড এলিমেন্ট, ফাইন্ড এলিমেন্ট নয়।

এবং তারপরে কতগুলি ফলাফল পুনরুদ্ধার থেকে ফিরে এসেছে তা পরীক্ষা করুন। যদি এটি দ্বিতীয় হয়, তবে আপনি এটি ব্যবহার করতে পারেন:

testit[1].Click();

বা ঠিক করার জন্য যাকে পুনরায় ব্যবহার করা আইডি পান।


যদি এটির কারণ এই আইডি দ্বারা একাধিক বোতাম রয়েছে এবং একবারে কেবল একটিই প্রদর্শিত হয়, একটি উচ্চতর সমাধানের সাথে লিনকিউ ব্যবহার করে প্রথম উপাদানটি দৃশ্যমান ( .First(x => x.Visible)সন্ধানকারী উপাদান কলটিতে সংযোজন করা যায়) এটি খুঁজে পাওয়া যায় এবং এটি বাতিল না হলে এটিতে ক্লিক করুন।
শান দুগগান

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পৃষ্ঠাটিতে লোড করে থাকেন তবে আপনি নিম্নলিখিত জাভাস্ক্রিপ্ট কমান্ডটি কার্যকর করতে পারেন:

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

পাইথন এক্সিকিউটর ব্যবহার করে উদাহরণ:

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

1

আমার একই সমস্যা ছিল এবং এটি ডিভ এবং ডিভের মধ্যে লিঙ্কের মধ্যে একটি আইডি দ্বন্দ্বের কারণে হয়েছিল। সুতরাং ড্রাইভারটি যে লিঙ্কটি চেয়েছিল তার পরিবর্তে ডিভিতে ক্লিক করছিল। আমি ডিভি আইডি পরিবর্তন করেছি এবং এটি সঠিকভাবে কাজ করেছে।

আগে:

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

পরে:

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

আপনি সমস্যার কারণ যে অবাক না। একটি পৃষ্ঠায় কেবল একটি আইডি থাকা উচিত। এটি অযৌক্তিকভাবে খারাপ নকশাটি কার্যকর ছিল না।
ডেভ লরেন্স

1

সেলেনিয়াম ব্যবহার করার সময় দ্রুপালে :

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