পাইথন ব্যবহার করে সেলেনিয়াম ওয়েবড্রাইভারে ওয়েবএলিমেন্টের এইচটিএমএল উত্স পান


473

আমি সেলেনিয়াম ওয়েবড্রাইভার চালাতে পাইথন বাইন্ডিং ব্যবহার করছি:

from selenium import webdriver
wd = webdriver.Firefox()

আমি জানি আমি এর মতো ওয়েবেলেট ধরতে পারি:

elem = wd.find_element_by_css_selector('#my-id')

এবং আমি জানি আমি এর সাথে পুরো পৃষ্ঠার উত্সটি পেতে পারি ...

wd.page_source

তবে "এলিমেন্ট সোর্স" পাওয়ার কি কোনও উপায় আছে?

elem.source   # <-- returns the HTML as a string

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

কোনও উপাদানটির (এবং তার শিশুদের) এইচটিএমএল অ্যাক্সেস করার সর্বোত্তম পথে কোনও চিন্তা?


8
আপনি কেবল wd.page_source
সুন্দরসুপ

উত্তর:


745

আপনি উপাদানটির সামগ্রীরinnerHTML উত্স পেতে বা বর্তমান উপাদানটির উত্সের জন্য অ্যাট্রিবিউটটি পড়তে পারেন ।outerHTML

পাইথন:

element.get_attribute('innerHTML')

জাভা:

elem.getAttribute("innerHTML");

সি #:

element.GetAttribute("innerHTML");

রুবি:

element.attribute("innerHTML")

জাতীয়:

element.getAttribute('innerHTML');

পিএইচপি:

$element->getAttribute('innerHTML');

পরীক্ষিত এবং সাথে কাজ করে ChromeDriver


9
ইনারএইচটিএমএল একটি ডিওএম বৈশিষ্ট্য নয়। সুতরাং উপরের উত্তর কাজ করবে না। ইনারএইচটিএমএল একটি জাভাস্ক্রিপ্ট জাভাস্ক্রিপ্ট মান। উপরের কাজটি শূন্য হয়ে যাবে। নীলেশের উত্তর সঠিক উত্তর।
বিবস্থ

6
এটি আমার পক্ষে দুর্দান্ত কাজ করে এবং গৃহীত উত্তরের চেয়ে অনেক বেশি মার্জিত। আমি সেলেনিয়াম 2.24.1 ব্যবহার করছি .1
রায়ান শিলিংটন

22
যদিও অভ্যন্তরীণ এইচটিএমএলটি কোনও ডিওএম বৈশিষ্ট্য নয় তবে এটি সমস্ত বড় ব্রাউজারগুলি ( quirksmode.org/dom/w3c_html.html ) দ্বারা ভাল সমর্থন করে । এটি আমার পক্ষেও ভাল কাজ করে।
কুওংহুইতো

3
+1 এটি রুবিতেও কাজ করে বলে মনে হচ্ছে। আমার একটি অনুভূতি আছে যে getAttributeপদ্ধতিটি (বা অন্যান্য ভাষায় সমতুল্য) কেবল js পদ্ধতিটিকে যার নামটি আর্গ বলে। তবে ডকুমেন্টেশনটি পরিষ্কারভাবে এটি বলে না, তাই নীলেশের সমাধানটি ফ্যালব্যাক হওয়া উচিত।
কেলভিন

23
এটি জন্য ব্যর্থ HtmlUnitDriverজন্য কাজ করে ChromeDriver, FirefoxDriver, InternetExplorerDriver(IE10) এবং PhantomJSDriver(আমি অন্যদের পরীক্ষা করা হয়েছে)।
acdcjunior

91

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

 WebElement element = driver.findElement(By.id("foo"));
 String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element); 

1
পাইথনের সমতুল্য হওয়া সত্ত্বেও মূলত এটিই আমি শেষ করেছি।
ক্রিস ডাব্লু।

8
আমি মনে করি নীচের উত্তরগুলি, এলিমেন্ট.ট্যাট্রিবিউট ("অভ্যন্তরীণ এইচটিএমএল") ব্যবহার করা খুব সহজ। লোকেরা কেন এটি ভোট দিচ্ছে তা আমি বুঝতে পারি না।
রায়ান শিলিংটন

1
একেবারে জাভাস্ক্রিপ্ট কল করার দরকার নেই। পাইথন শুধু ব্যবহার element.get_attribute ( 'innerHTML') সালে
Anthon

6
@ অ্যানথন innerHTMLএকটি ডিওএম বৈশিষ্ট্য নয়। ২০১১ সালে আমি যখন এই প্রশ্নের উত্তর দিয়েছিলাম, এটি আমার পক্ষে কার্যকর হয়নি, দেখে মনে হচ্ছে এখন কোনও ব্রাউজার এটি সমর্থন করছে। যদি এটি আপনার পক্ষে কাজ করে তবে ব্যবহার innerHTMLকরা ক্লিনার। তবে এটি সমস্ত ব্রাউজারে কাজ করবে এমন কোনও গ্যারান্টি নেই।
নিলেশ

2
দৃশ্যত, এই RemoteWebDriver ব্যবহার করার সময় innerHTML পেতে একমাত্র উপায়
Illidan

73

নিশ্চিত হয়ে আমরা নীচে সেলেনিয়াম পাইথনে এই স্ক্রিপ্ট সহ সমস্ত এইচটিএমএল উত্স কোড পেতে পারি:

elem = driver.find_element_by_xpath("//*")
source_code = elem.get_attribute("outerHTML")

আপনি যদি ফাইলটিতে এটি সংরক্ষণ করতে চান:

with open('c:/html_source_code.html', 'w') as f:
    f.write(source_code.encode('utf-8'))

আমি কোনও ফাইলে সংরক্ষণের পরামর্শ দিচ্ছি কারণ উত্স কোডটি খুব দীর্ঘ।


2
আমি কি একটি বিলম্ব সেট করতে এবং সর্বশেষ উত্স পেতে পারি? জাভাস্ক্রিপ্ট ব্যবহার করে লোড করা গতিশীল সামগ্রী রয়েছে।
কোডগুরু

পৃষ্ঠাটি পুরোপুরি লোড না হলেও এটি কী কাজ করে? এছাড়াও, @ ফ্লাইংআ্যাটমের মতো বিলম্ব সেট করার কোনও উপায় আছে কি?
TheRookierLearner 16

13

রুবিতে, সেলেনিয়াম-ওয়েবড্রাইভার (2.32.1) ব্যবহার করে এমন একটি page_sourceপদ্ধতি রয়েছে যা পুরো পৃষ্ঠার উত্স ধারণ করে contains


5

বৈশিষ্ট্য পদ্ধতিটি ব্যবহার করা আসলে, সহজ এবং আরও সোজা এগিয়ে straight

সেলেনিয়াম এবং পেজঅবজেক্ট রত্নগুলির সাথে রুবি ব্যবহার করে শ্রেণিটিকে একটি নির্দিষ্ট উপাদানের সাথে যুক্ত করার জন্য, লাইনটি হবে element.attribute(Class)

আপনি যদি উপাদানটির সাথে যুক্ত অন্যান্য বৈশিষ্ট্যগুলি পেতে চান তবে একই ধারণাটি প্রযোজ্য। উদাহরণস্বরূপ, আমি যদি কোনও উপাদানটির স্ট্রিং চাইতাম element.attribute(String),।


4

পুরানো দেখায়, তবে এটি এখানে যাই হোক না কেন। আপনার ক্ষেত্রে এটি করার সঠিক উপায়:

elem = wd.find_element_by_css_selector('#my-id')
html = wd.execute_script("return arguments[0].innerHTML;", elem)

অথবা

html = elem.get_attribute('innerHTML')

উভয়ই আমার পক্ষে কাজ করছেন (সেলেনিয়াম-সার্ভার-স্ট্যান্ডেলোন -২.৩৫.০)


3

সেলেনিয়াম 2.53.0 সহ জাভা

driver.getPageSource();

এটাই প্রশ্নটির জন্য নয়
কোরি গোল্ডবার্গ

ওয়েবড্রাইভারের উপর নির্ভর করে getPageSourceপদ্ধতিটি প্রকৃত পৃষ্ঠা উত্সটি (যেমন সম্ভাব্য জাভাস্ক্রিপ্ট পরিবর্তনের সাহায্যে) ফিরিয়ে দিতে পারে না। ফিরে আসা উত্সটি সার্ভার দ্বারা প্রেরিত কাঁচা উত্স হতে পারে। এই পয়েন্টটি নিশ্চিত করতে ওয়েবড্রাইভার ডকটি অবশ্যই পরীক্ষা করা উচিত।
স্টিফান

2

আমি আশা করি এটি সাহায্য করতে পারে: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html

এখানে জাভা পদ্ধতি বর্ণনা করা হয়েছে:

java.lang.String    getText() 

তবে দুর্ভাগ্যক্রমে পাইথনে এটি উপলব্ধ নেই। সুতরাং আপনি জাভা থেকে পাইথনটিতে পদ্ধতির নামগুলি অনুবাদ করতে পারেন এবং পুরো পৃষ্ঠার উত্স না পেয়ে উপস্থিত পদ্ধতিগুলি ব্যবহার করে অন্য যুক্তি চেষ্টা করতে পারেন ...

যেমন

 my_id = elem[0].get_attribute('my-id')

6
পাইথনের আসলে "গেটেক্সটেক্সট" সমতুল্য থাকে (আমি মনে করি এটির কেবল "পাঠ্য" বৈশিষ্ট্যটি আছে?) তবে এটি কেবল HTML ট্যাগগুলির মধ্যে "প্লেইনটেক্সট" প্রদান করে এবং পুরো HTML উত্সটি ফিরিয়ে দেয় না।
ক্রিস ডাব্লু।

2
এটি জাভাতে কেবল সরল পাঠ্য (এইচটিএমএল নয়) প্রদান করে।
রায়ান শিলিংটন

আপনি অবশ্যই এটিকে রেফারেন্স করবেন যেমন আপনি
এলিমে


1

ইনারএইচটিএমএল নির্বাচিত উপাদানটির অভ্যন্তরে উপাদানটি ফিরে আসবে এবং বহিরাগত এইচটিএমএল আপনার নির্বাচিত উপাদানটির সাথে HTML এর অভ্যন্তরে ফিরে আসবে

উদাহরণ: - এখন ধরুন আপনার এলিমেন্টটি নীচের মতো

<tr id="myRow"><td>A</td><td>B</td></tr>

অভ্যন্তরীণ এইচটিএমএল উপাদান আউটপুট

<td>A</td><td>B</td>

আউটপুট HTML

<tr id="myRow"><td>A</td><td>B</td></tr>

সরাসরি উদাহরণ: -

http://www.java2s.com/Tutorials/JavascriptDemo/f/find_out_the_difference_between_innerhtml_and_outerhtml_in_javascript_example.htm

নীচে আপনি বিভিন্ন বাঁধাই অনুসারে প্রয়োজনীয় সিনট্যাক্স পাবেন। পরিবর্তন innerHTMLকরার জন্য outerHTMLঅনুযায়ী প্রয়োজন।

পাইথন:

element.get_attribute('innerHTML')

জাভা:

elem.getAttribute("innerHTML");

আপনি যদি পুরো পৃষ্ঠার এইচটিএমএল কোডের নীচে ব্যবহার করতে চান: -

driver.getPageSource();

0
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return      arguments[0].innerHTML;", element); 

এই কোডটি উত্স থেকে জাভাস্ক্রিপ্ট পেতে সত্যই কাজ করে!


0

এবং পিএইচপিউনিট সেলেনিয়াম পরীক্ষায় এটির মতো:

$text = $this->byCssSelector('.some-class-nmae')->attribute('innerHTML');

0

আপনি যদি পাইথনে রিমোট কন্ট্রোলের কোনও সমাধানে আগ্রহী হন, তবে কিভাবে অভ্যন্তরীণ এইচটিএমএল পাবেন তা এখানে:

innerHTML = sel.get_eval("window.document.getElementById('prodid').innerHTML")

সহায়তার জন্য ধন্যবাদ, আমি এটি ব্যবহার করেছি। আমিও innerHTML = {solenium selector code}.textএকই কাজগুলি দেখতে পাই ।
শান

0

আমি পছন্দ করি এমন রেন্ডার এইচটিএমএল পাওয়ার পদ্ধতিটি নিম্নলিখিত:

driver.get("http://www.google.com")
body_html = driver.find_element_by_xpath("/html/body")
print body_html.text

তবে উপরের পদ্ধতিটি সমস্ত ট্যাগ সরিয়ে দেয় (হ্যাঁ নেস্টেড ট্যাগগুলিও) এবং কেবলমাত্র পাঠ্য সামগ্রী দেয়। আপনি যদি এইচটিএমএল মার্কআপটি পেতে আগ্রহী হন তবে নীচের পদ্ধতিটি ব্যবহার করুন।

print body_html.getAttribute("innerHTML")

1
পৃষ্ঠার বডি কনটেন্টে পৌঁছানোর জন্য আপনি ড্রাইভার.ফাইন্ড_ইলেটমেন্ট_বি_ট্যাগ ("বডি") ব্যবহার করতে পারেন।
মরিচা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.