পৃষ্ঠাটি লোড হওয়ার জন্য আপনি কীভাবে সেলেনিয়াম 2.0 অপেক্ষা করবেন?
পৃষ্ঠাটি লোড হওয়ার জন্য আপনি কীভাবে সেলেনিয়াম 2.0 অপেক্ষা করবেন?
উত্তর:
আপনি নিম্নলিখিত কোড ব্যবহার করে পৃষ্ঠাটি লোডও করতে পারেন
IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));
wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
ক্লাস ওয়েবড্রাইভারওয়েট ব্যবহার করুন
এছাড়াও এখানে দেখুন
আপনি কিছু উপাদান প্রদর্শন আশা করতে পারেন। সি # তেমন কিছু:
WebDriver _driver = new WebDriver();
WebDriverWait _wait = new WebDriverWait(_driver, new TimeSpan(0, 1, 0));
_wait.Until(d => d.FindElement(By.Id("Id_Your_UIElement"));
আপনি যদি ড্রাইভারটির অন্তর্নিহিত অপেক্ষার সেট করে থাকেন, তবে findElement
লোড হওয়া পৃষ্ঠায় আপনি যে উপাদানটি প্রত্যাশা করছেন তার জন্য পদ্ধতিটি কল করুন , যখনই এটি উপাদানটি খুঁজে না পায় বা টাইম আউট মান পর্যন্ত না পৌঁছায় ততক্ষণ ওয়েবড্রাইভার সেই উপাদানটির জন্য পোল করে।
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
উত্স: অন্তর্নিহিত-অপেক্ষা
সাধারণভাবে, সেলেনিয়াম ২.০ সহ ওয়েব ড্রাইভারটি কেবল পৃষ্ঠা লোড হয়েছে কিনা তা স্থির করে নিলে কেবলমাত্র কলিং কোডে নিয়ন্ত্রণ ফিরিয়ে আনতে হবে। যদি এটি না হয়, আপনি কল করতে পারেন waitforelemement
, কোন চক্রটি রাউন্ড কলিং findelement
এটি না পাওয়া অবধি বা সময় শেষ না হওয়া পর্যন্ত (সময় নির্ধারণ করা যাবে)।
If click() causes a new page to be loaded via an event or is done by sending a native event (which is a common case on Firefox, IE on Windows) then the method will not wait for it to be loaded and the caller should verify that a new page has been loaded.
JavascriptExecutor
নথির জন্য অপেক্ষা করে , একটি অপেক্ষা যোগ করেছি ready সেলেনিয়াম থেকে ব্রাউজারে রাউন্ড ট্রিপ হওয়ার কারণে, আমার ধারণা রেসের অবস্থা হ্রাস পেয়েছে, এবং এটি "সর্বদা" আমার পক্ষে কাজ করে। "ক্লিক করুন ()" পরে যখন আমি কোনও পৃষ্ঠা লোড হওয়ার আশা করি, আমি রেডস্টেটের জন্য স্পষ্টভাবে অপেক্ষা করি (ওয়েবড্রাইভারওয়াইট ব্যবহার করে)। ]
রুবি বাস্তবায়ন:
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {
@driver.execute_script("return document.readyState;") == "complete"
}
আপনি System.out
লাইনটি সরিয়ে ফেলতে পারেন । এটি ডিবাগ উদ্দেশ্যে যুক্ত করা হয়।
WebDriver driver_;
public void waitForPageLoad() {
Wait<WebDriver> wait = new WebDriverWait(driver_, 30);
wait.until(new Function<WebDriver, Boolean>() {
public Boolean apply(WebDriver driver) {
System.out.println("Current Window State : "
+ String.valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState")));
return String
.valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState"))
.equals("complete");
}
});
}
এই সমস্ত সমাধান নির্দিষ্ট ক্ষেত্রে ক্ষেত্রে ঠিক আছে তবে তারা কমপক্ষে কয়েকটি সম্ভাব্য সমস্যায় ভুগছে:
এগুলি যথেষ্ট জেনেরিক নয় - তারা আপনার আগে জানতে চেয়েছিল যে আপনি যে পৃষ্ঠাটিতে যাচ্ছেন তার কোনও নির্দিষ্ট শর্তটি সত্য হবে (উদাহরণস্বরূপ কিছু উপাদান প্রদর্শিত হবে)
এগুলি এমন একটি রেসের শর্তের জন্য উন্মুক্ত যেখানে আপনি এমন একটি উপাদান ব্যবহার করেন যা পুরানো পৃষ্ঠায় পাশাপাশি নতুন পৃষ্ঠায় উপস্থিত থাকে।
এই সমস্যাটি এড়ানো জেনেরিক সমাধানের জন্য আমার প্রচেষ্টা এখানে রয়েছে (পাইথনে):
প্রথমত, একটি জেনেরিক "অপেক্ষা" ফাংশন (আপনি যদি পছন্দ করেন তবে ওয়েবড্রাইভারওয়াইট ব্যবহার করুন) আমি তাদের কুৎসিত মনে করি:
def wait_for(condition_function):
start_time = time.time()
while time.time() < start_time + 3:
if condition_function():
return True
else:
time.sleep(0.1)
raise Exception('Timeout waiting for {}'.format(condition_function.__name__))
এরপরে, সমাধানটি এই স্তরের উপর নির্ভর করে যে সেলেনিয়াম শীর্ষ স্তরের সহ কোনও পৃষ্ঠার সমস্ত উপাদানগুলির জন্য একটি (অভ্যন্তরীণ) আইডি-নম্বর রেকর্ড করে <html>
উপাদান । যখন একটি পৃষ্ঠা সতেজ বা লোড হয়, এটি একটি নতুন আইডি সহ একটি নতুন এইচটিএমএল উপাদান পায়।
সুতরাং, ধরে নিয়ে আপনি উদাহরণস্বরূপ "আমার লিঙ্ক" পাঠ্যের একটি লিঙ্কে ক্লিক করতে চান:
old_page = browser.find_element_by_tag_name('html')
browser.find_element_by_link_text('my link').click()
def page_has_loaded():
new_page = browser.find_element_by_tag_name('html')
return new_page.id != old_page.id
wait_for(page_has_loaded)
আরও পাইথোনিক, পুনরায় ব্যবহারযোগ্য, জেনেরিক সহায়তার জন্য আপনি একটি প্রসঙ্গ পরিচালক প্রস্তুত করতে পারেন:
from contextlib import contextmanager
@contextmanager
def wait_for_page_load(browser):
old_page = browser.find_element_by_tag_name('html')
yield
def page_has_loaded():
new_page = browser.find_element_by_tag_name('html')
return new_page.id != old_page.id
wait_for(page_has_loaded)
এবং তারপরে আপনি এটিকে কোনও সেলেনিয়াম মিথস্ক্রিয়াতে ব্যবহার করতে পারেন:
with wait_for_page_load(browser):
browser.find_element_by_link_text('my link').click()
আমি হিসেব করি বুলেটপ্রুফ! আপনি কি মনে করেন?
এটি সম্পর্কে একটি ব্লগ পোস্টে আরও তথ্য
আপনি ক্লাসটিও ব্যবহার ExpectedConditions
করতে পারেন: কোনও পদক্ষেপ গ্রহণের আগে আপনি আরও পদক্ষেপ নেওয়ার আগে ওয়েবপৃষ্ঠায় কোনও উপাদান প্রদর্শিত হওয়ার জন্য স্পষ্টভাবে অপেক্ষা করতে
ExpectedConditions
কোনও উপাদান দৃশ্যমান কিনা তা নির্ধারণ করতে আপনি ক্লাসটি ব্যবহার করতে পারেন :
WebElement element = (new WebDriverWait(getDriver(), 10)).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input#houseName")));
আপনি যে ExpectedConditions class Javadoc
সমস্ত শর্ত পরীক্ষা করতে সক্ষম হচ্ছেন তার তালিকা দেখুন ।
ইমরানের উত্তর জাভা for-এর জন্য পুনঃনির্দেশিত:
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver wdriver) {
return ((JavascriptExecutor) driver).executeScript(
"return document.readyState"
).equals("complete");
}
});
এটি ওয়েবড্রাইভারের একটি গুরুতর সীমাবদ্ধতা বলে মনে হচ্ছে। স্পষ্টতই কোনও উপাদানটির জন্য অপেক্ষা করা বোঝানো হচ্ছে যে পৃষ্ঠাটি লোড হচ্ছে না, বিশেষত ডিওএম সম্পূর্ণরূপে বিল্ড (অনড্রেড স্টেট) হতে পারে যার ফলে জেএস এখনও কার্যকর করছে এবং সিএসএস এবং চিত্রগুলি এখনও লোড হচ্ছে।
আমি বিশ্বাস করি যে সহজ সমাধান হ'ল সবকিছু শুরু করার পরে অনলোড ইভেন্টের উপরে একটি জেএস ভেরিয়েবল সেট করা এবং সেলেনিয়ামে এই জেএস ভেরিয়েবলটি পরীক্ষা করে অপেক্ষা করুন।
আপনি যদি কোনও নির্দিষ্ট উপাদান লোড হওয়ার জন্য অপেক্ষা করতে চান তবে আপনি এই isDisplayed()
পদ্ধতিটি একটিতে ব্যবহার করতে পারেন RenderedWebElement
:
// Sleep until the div we want is visible or 5 seconds is over
long end = System.currentTimeMillis() + 5000;
while (System.currentTimeMillis() < end) {
// Browsers which render content (such as Firefox and IE) return "RenderedWebElements"
RenderedWebElement resultsDiv = (RenderedWebElement) driver.findElement(By.className("gac_m"));
// If results have been returned, the results are displayed in a drop down.
if (resultsDiv.isDisplayed()) {
break;
}
}
( 5 মিনিট শুরু করা গাইডের উদাহরণ )
RenderedWebElement
। তবে, isDisplayed()
পদ্ধতিটি এখন সরাসরি উপলভ্য WebElement
।
এই শর্ত না দেওয়া পর্যন্ত এই অপেক্ষাটিতে স্পষ্টভাবে অপেক্ষা করুন বা শর্তাধীন অপেক্ষা করুন।
WebDriverWait wait = new WebDriverWait(wb, 60);
wait.until(ExpectedConditions.elementToBeClickable(By.name("value")));
এটি প্রতিটি ওয়েব উপাদানটির জন্য 60 সেকেন্ডের জন্য অপেক্ষা করবে।
প্রদত্ত সময় পর্যন্ত পৃষ্ঠায় প্রতিটি উপাদানটির অপেক্ষার জন্য স্পষ্টভাবে অপেক্ষা করুন।
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
এটি প্রতিটি ওয়েব উপাদানটির জন্য 60 সেকেন্ডের জন্য অপেক্ষা করবে।
প্রদত্ত সময় পর্যন্ত পৃষ্ঠায় প্রতিটি উপাদানটির অপেক্ষার জন্য স্পষ্টভাবে অপেক্ষা করুন।
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
30 সেকেন্ডের জন্য পৃষ্ঠাতে প্রতিটি উপাদানটির জন্য এটি অপেক্ষা করুন।
অন্য অপেক্ষাটি প্রদত্ত শর্ত না হওয়া পর্যন্ত এই অপেক্ষায় স্পষ্টভাবে অপেক্ষা বা শর্তসাপেক্ষ অপেক্ষা wait
WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
আইডিতে স্থির উপাদান আইডি দিন যা স্বতঃস্ফূর্তভাবে পৃষ্ঠায় প্রদর্শিত হয় পৃষ্ঠাটি লোড হওয়ার সাথে সাথে।
আমি অবাক হয়েছি যে পূর্বাভাসগুলি প্রথম পছন্দ নয় কারণ আপনি সাধারণত জানেন যে আপনি পরবর্তী পৃষ্ঠাটিতে লোডের জন্য অপেক্ষা করছেন কোন উপাদান (গুলি) এর সাথে আপনি ইন্টারঅ্যাক্ট করবেন। আমার পদ্ধতির সবসময় তৈরি করা হয়েছে predicates / মতো কাজগুলির waitForElementByID(String id)
এবংwaitForElemetVisibleByClass(String className)
, ইত্যাদি এবং তারপর ব্যবহার এবং এই পুনরায় ব্যবহার যেখানেই আমি তাদের প্রয়োজন, আমি অপেক্ষা করছি একটি পৃষ্ঠা লোড অথবা পৃষ্ঠার বিষয়বস্তু পরিবর্তনের জন্য এটা হতে।
উদাহরণ স্বরূপ,
আমার পরীক্ষার ক্লাসে:
driverWait.until(textIsPresent("expectedText");
আমার পরীক্ষার শ্রেণিতে পিতামাতা:
protected Predicate<WebDriver> textIsPresent(String text){
final String t = text;
return new Predicate<WebDriver>(){
public boolean apply(WebDriver driver){
return isTextPresent(t);
}
};
}
protected boolean isTextPresent(String text){
return driver.getPageSource().contains(text);
}
যদিও এটি অনেকটা মনে হচ্ছে, আপনার জন্য বারবার যাচাই করা এবং সময় নির্ধারণের আগে চূড়ান্ত অপেক্ষার সময় সহ কতক্ষণ পরীক্ষা করা যায় তার জন্য অন্তর অন্তর অন্তর্নিহিত যত্ন গ্রহণ করে। এছাড়াও, আপনি এই জাতীয় পদ্ধতি পুনরায় ব্যবহার করবেন।
এই উদাহরণে, পিতা বা মাতা বর্গ সংজ্ঞায়িত করা হয় এবং প্রবর্তিত WebDriver driver
এবং WebDriverWait driverWait
।
আশা করি এটা কাজে লাগবে.
ওয়েবড্রাইভারের জন্য জাভা বাইন্ডিংগুলি ব্যবহার করার সময় পৃষ্ঠা লোডগুলির জন্য অপেক্ষা করার সর্বোত্তম উপায় হ'ল পেজ ফ্যাক্টরির সাথে পৃষ্ঠা অবজেক্ট ডিজাইন প্যাটার্নটি ব্যবহার করা। এটি আপনাকে এটি ব্যবহার করার অনুমতি দেয় AjaxElementLocatorFactory
যা এটি কেবল আপনার সমস্ত উপাদানগুলির জন্য বৈশ্বিক অপেক্ষা হিসাবে কাজ করে। ড্রপ-বাক্স বা জটিল জাভাস্ক্রিপ্ট ট্রানজিশনের মতো উপাদানগুলির এটির সীমাবদ্ধতা রয়েছে তবে এটি প্রয়োজনীয় কোডের পরিমাণকে হ্রাস করবে এবং পরীক্ষার সময়গুলিকে গতি বাড়িয়ে তুলবে। একটি ভাল উদাহরণ এই ব্লগপোস্টে পাওয়া যাবে। কোর জাভা সম্পর্কে প্রাথমিক ধারণা অনুমান করা হয়।
http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html
নোডজেএস সমাধান:
ইন Nodejs আপনি এটা প্রতিশ্রুতি মাধ্যমে পেতে পারেন ...
আপনি যদি এই কোডটি লিখেন তবে আপনি নিশ্চিত হয়ে উঠতে পারেন যে আপনি তখন পৌঁছালে পৃষ্ঠাটি সম্পূর্ণ লোড হয়ে গেছে ...
driver.get('www.sidanmor.com').then(()=> {
// here the page is fully loaded!!!
// do your stuff...
}).catch(console.log.bind(console));
আপনি যদি এই কোডটি লিখেন, আপনি নেভিগেট করবেন, এবং সেলেনিয়াম 3 সেকেন্ড অপেক্ষা করবে ...
driver.get('www.sidanmor.com');
driver.sleep(3000);
// you can't be sure that the page is fully loaded!!!
// do your stuff... hope it will be OK...
সেলেনিয়াম ডকুমেন্টেশন থেকে:
this.get (url) → তারপরযোগ্য
প্রদত্ত ইউআরএল নেভিগেট করার জন্য একটি কমান্ডের তালিকা তৈরি করে।
ডকুমেন্টের লোড শেষ হয়ে গেলে সমাধান করা হবে এমন প্রতিশ্রুতি দেয় ।
এখানে বর্তমানে সর্বাধিক উত্সাহিত উত্তরের একটি জাভা 8 সংস্করণ রয়েছে :
WebDriverWait wait = new WebDriverWait(myDriver, 15);
wait.until(webDriver -> ((JavascriptExecutor) myDriver).executeScript("return document.readyState").toString().equals("complete"));
কোথায় myDriver
একটি WebDriver
বস্তু (আগে ঘোষিত)।
দ্রষ্টব্য : সচেতন হন যে এই পদ্ধতিটি ( document.readyState
) কেবলমাত্র ডিওএম পরীক্ষা করে।
আপনার স্ক্রিপ্টে ফাংশনের নীচে কল করুন, জাভাস্ক্রিপ্ট ব্যবহার করে পৃষ্ঠাটি লোড না হওয়া পর্যন্ত এটি অপেক্ষা করবে
public static boolean isloadComplete(WebDriver driver)
{
return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("loaded")
|| ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
}
/**
* Call this method before an event that will change the page.
*/
private void beforePageLoad() {
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.mpPageReloaded='notYet';");
}
/**
* Call this method after an event that will change the page.
*
* @see #beforePageLoad
*
* Waits for the previous page to disappear.
*/
private void afterPageLoad() throws Exception {
(new WebDriverWait(driver, 10)).until(new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver driver) {
JavascriptExecutor js = (JavascriptExecutor) driver;
Object obj = js.executeScript("return document.mpPageReloaded;");
if (obj == null) {
return true;
}
String str = (String) obj;
if (!str.equals("notYet")) {
return true;
}
return false;
}
});
}
যেখানে নথির কেবলমাত্র অংশ পরিবর্তন করা হচ্ছে সে ক্ষেত্রে আপনি নথী থেকে কোনও উপাদানতে পরিবর্তন করতে পারেন।
এই কৌশলটি আবেগের উত্তর থেকে অনুপ্রাণিত হয়েছিল।
সেলেনিয়ামওয়েটার :
import com.google.common.base.Function;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;
public class SeleniumWaiter {
private WebDriver driver;
public SeleniumWaiter(WebDriver driver) {
this.driver = driver;
}
public WebElement waitForMe(By locatorname, int timeout){
WebDriverWait wait = new WebDriverWait(driver, timeout);
return wait.until(SeleniumWaiter.presenceOfElementLocated(locatorname));
}
public static Function<WebDriver, WebElement> presenceOfElementLocated(final By locator) {
// TODO Auto-generated method stub
return new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
};
}
}
এবং আপনি এটি ব্যবহার :
_waiter = new SeleniumWaiter(_driver);
try {
_waiter.waitForMe(By.xpath("//..."), 10);
}
catch (Exception e) {
// Error
}
আপনি পেজলডটাইমআউটটির জন্য সময় নির্ধারণ করতে নীচের বিদ্যমান পদ্ধতিটি নীচের উদাহরণে ব্যবহার করতে পারেন উদাহরণস্বরূপ পৃষ্ঠাটি লোড হতে 20 সেকেন্ডের বেশি সময় নিচ্ছে, তবে এটি পৃষ্ঠা পুনরায় লোডের একটি ব্যতিক্রম ছুঁড়ে ফেলবে
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS)
আপনি কোনও পদক্ষেপ নেওয়ার আগে ওয়েবপৃষ্ঠায় কোনও উপাদান প্রদর্শিত হওয়ার জন্য স্পষ্টভাবে অপেক্ষা করতে পারেন (এলিমেন্ট.লিক্লিক () এর মতো)
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.id("myDynamicElement"));
}});
এটি আমি একই জাতীয় দৃশ্যের জন্য ব্যবহার করেছি এবং এটি দুর্দান্ত কাজ করে।
আমি দেখেছি সেরা উপায়টি হচ্ছে stalenessOf
প্রত্যাশিত শর্তটি ব্যবহার করা , পুরানো পৃষ্ঠাটি বাসি হয়ে যাওয়ার জন্য অপেক্ষা করা।
উদাহরণ:
WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement oldHtml = driver.findElement(By.tagName("html"));
wait.until(ExpectedConditions.stalenessOf(oldHtml));
পুরানো এইচটিএমএল ট্যাগের বাসি হয়ে যাওয়ার জন্য এটি দশ সেকেন্ড অপেক্ষা করবে এবং এটি না ঘটলে একটি ব্যতিক্রম ছুঁড়ে ফেলবে।
আমি নোড + সেলেনিয়াম-ওয়েবড্রাইভার ব্যবহার করি (বর্তমানে সংস্করণটি 3.5.0)। আমি এর জন্য যা করি তা হ'ল:
var webdriver = require('selenium-webdriver'),
driver = new webdriver.Builder().forBrowser('chrome').build();
;
driver.wait(driver.executeScript("return document.readyState").then(state => {
return state === 'complete';
}))
আপনি অপেক্ষা করতে পারেন। সেলেনিয়ামে মূলত 2 প্রকারের অপেক্ষা রয়েছে
- অন্তর্নিহিত অপেক্ষা
এটি খুব সাধারণ দয়া করে নীচের বাক্য গঠন দেখুন:
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
- সুস্পষ্ট অপেক্ষা
প্রদত্ত শর্তটি না হওয়া পর্যন্ত এই অপেক্ষায় স্পষ্টতই অপেক্ষা করুন বা শর্তাধীন অপেক্ষা করুন।
WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
আপনি অন্যান্য বৈশিষ্ট্য যেমন ব্যবহার করতে পারেন visblityOf()
,visblityOfElement()
যদি কেউ সেলেনাইড ব্যবহার করে:
public static final Long SHORT_WAIT = 5000L; // 5 seconds
$("some_css_selector").waitUntil(Condition.appear, SHORT_WAIT);
আরও শর্তাবলী এখানে পাওয়া যাবে: http://selenide.org/javadoc/3.0/com/codeborne/selenide/Condition.html
আমার ক্ষেত্রে, পৃষ্ঠা লোডের স্থিতি জানতে আমি নীচে ব্যবহার করেছি used আমাদের অ্যাপ্লিকেশনটিতে লোডিং জিআইএফ (গুলি) উপস্থিত রয়েছে এবং, স্ক্রিপ্টে অযাচিত অপেক্ষার সময়টি নির্মূল করার জন্য আমি তাদের নীচে শুনি।
public static void processing(){
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
}
যেখানে xpath এইচটিএমএল ডিওএমে জিআইএফ চিহ্নিত করে। এর পরে, আপনি নিজের ক্রিয়া পদ্ধতিতে ক্লিকও প্রয়োগ করতে পারেন।
public static void click(WebElement elementToBeClicked){
WebDriverWait wait = new WebDriverWait(driver, 45);
wait.until(ExpectedConditions.visibilityOf(element));
wait.until(ExpectedConditions.elementToBeClickable(element));
wait.ignoring(NoSuchElementException.class).ignoring(StaleElementReferenceException.class); elementToBeClicked.click();
}
ম্যান এই সমস্ত উত্তরগুলির জন্য খুব বেশি কোড প্রয়োজন। এটি খুব সাধারণ হিসাবে এটি সাধারণ জিনিস হওয়া উচিত।
কেবল ওয়েবড্রাইভার দিয়ে কিছু সাধারণ জাভাস্ক্রিপ্ট কেন ইনজেক্ট করবেন না। আমি আমার ওয়েবস্ক্রেপার ক্লাসে এই পদ্ধতিটি ব্যবহার করি। আপনি জেএস না জানলেও জাভাস্ক্রিপ্ট বেশ বেসিক।
def js_get_page_state(self):
"""
Javascript for getting document.readyState
:return: Pages state.
More Info: https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState
"""
ready_state = self.driver.execute_script('return document.readyState')
if ready_state == 'loading':
self.logger.info("Loading Page...")
elif ready_state == 'interactive':
self.logger.info("Page is interactive")
elif ready_state == 'complete':
self.logger.info("The page is fully loaded!")
return ready_state
ক্লিকের পরে নিম্নলিখিত আকর্ষণীয় পদ্ধতির সরবরাহ করার পরে কীভাবে সেলেনিয়াম পৃষ্ঠা লোডের জন্য অপেক্ষা করতে পাবেন?
WebElement
পুরানো পৃষ্ঠা থেকে একটিতে একটি রেফারেন্স সঞ্চয় করুন ।WebElement
যতক্ষণ না StaleElementReferenceException
নিক্ষেপ করা হয় ততক্ষণ চালনা চালিয়ে যান ।কোডের উদাহরণ:
WebElement link = ...;
link.click();
new WebDriverWait(webDriver, timeout).until((org.openqa.selenium.WebDriver input) ->
{
try
{
link.isDisplayed();
return false;
}
catch (StaleElementReferenceException unused)
{
return true;
}
});
new WebDriverWait(driver, 10).until(ExpectedConditions.stalenessOf(element))
।