সেলেনিয়াম ওয়েবড্রাইভার (পাইথন) এর নির্দিষ্ট পাঠ্য রয়েছে এমন একটি উপাদান আমি কীভাবে খুঁজে পাব?


259

আমি সেলেনিয়াম (পাইথন ইন্টারফেস এবং একাধিক ব্রাউজার জুড়ে) এর সাথে একটি জটিল জাভাস্ক্রিপ্ট ইন্টারফেস পরীক্ষা করার চেষ্টা করছি। আমার কাছে ফর্মের কয়েকটি বোতাম রয়েছে:

<div>My Button</div>

আমি "আমার বোতাম" এর উপর ভিত্তি করে বোতামগুলি অনুসন্ধান করতে সক্ষম হতে চাই (বা "কেস-সংবেদনশীল, আংশিক মিল যেমন" আমার বোতাম "বা" বোতাম ")

আমি এই আশ্চর্যরকমভাবে কঠিন খুঁজে পাচ্ছি, যে পরিমাণে আমার মনে হচ্ছে আমি স্পষ্ট কিছু মিস করছি। আমার এখন পর্যন্ত সবচেয়ে ভাল জিনিসটি হ'ল:

driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]')

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

<div class="outer"><div class="inner">My Button</div></div>

div.outer এর পাঠ্য হিসাবে "আমার বোতাম" আছে। এটি সংশোধন করার জন্য, আমি ডিভ.উইটারটি ডিভাইনার এর পিতামাতা কিনা তা দেখার চেষ্টা করেছি, তবে কীভাবে এটি করা যায় তা বুঝতে পারি না (এলিমেন্ট.জেট_ইলেমেন্ট_বি_স্প্যাথ ('..')) কোনও উপাদানটির পিতামাতাকে ফিরিয়ে দেয় তবে এটি Div.outer এর সমান নয় পরীক্ষা)। এছাড়াও, পৃষ্ঠার সমস্ত উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করা খুব ধীর বলে মনে হচ্ছে, কমপক্ষে Chrome ওয়েবড্রাইভার ব্যবহার করে।

ধারনা?

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


বর্তমান উত্তরগুলি আমার পক্ষে কার্যকর হয়নি। এইটি করেছেন: sqa.stackexchange.com/a/2486
আলেজান্দ্রো

উত্তর:


328

নিম্নলিখিত চেষ্টা করুন:

driver.find_elements_by_xpath("//*[contains(text(), 'My Button')]")

3
উত্তরের জন্য আপনাকে ধন্যবাদ, এটি আমার প্রয়োজনের 50% ছিল (আমাকে শুরু করে দিয়েছিলেন)। আমি যে ফর্মটিতে পৌঁছেছি তা হ'ল এটি "(// * [এতে (পাঠ্য (), '" + পাঠ্য + ""))] | // * [@ মান =' "+ পাঠ্য +" ']) "এটি অনুসন্ধান করবে প্রদত্ত পাঠ্যটি কেবলমাত্র এলিমেন্ট নোডের মধ্যেই নয়, ইনপুট উপাদানগুলির অভ্যন্তরেও যার পাঠ্যটি 'মান' বৈশিষ্ট্য হিসাবে <বোতাম মান = "আমার বোতাম" /> এর মাধ্যমে সেট করা হয়েছিল। যদিও খেয়াল রাখবেন না, মানটি অবশ্যই কড়া ম্যাচ হওয়া উচিত, কেবল পাঠ্যটি অন্তর্ভুক্ত নয়।
ইভান কোশ্লেভ

9
অন্যান্য সার্চ ইঞ্জিন দর্শনার্থীদের জন্যও উল্লেখযোগ্য: আপনি যদি কোনও লিঙ্কটি সন্ধান করেন তবে কিছু পদ্ধতি find_element(s)_by_link_textএবং find_element(s)_by_partial_link_textপদ্ধতি রয়েছে
ড্যান পাসারো

3
লেখাটি গতিশীল হলে কী হবে? এটিতে, উদ্ধৃতি থাকতে পারে। এই সমাধানটি কি ভাঙ্গবে না?
আইসডড্যান্ট

3
নির্দিষ্ট নামগুলির সন্ধান করা মনে হচ্ছে এটি ভেঙে যাচ্ছে। উদাহরণস্বরূপ নিম্নলিখিতটি নিন: "// * [এতে (পাঠ্য (), '" + ব্যবহারকারীর নাম + "')]]" যদি ব্যবহারকারীর নাম = "ও'রিলি" থাকে; তাহলে এক্সপথটি অবৈধ হয়ে যাবে। এই সমস্যা এড়ানোর একটি উপায় আছে কি?
সাকামোটো কাজুমা

লক্ষ্য পাঠ্যের একাধিক লাইন থাকলে এটি কাজ করবে বলে মনে হয় না।
শান

29

আপনি এক্সপ্যাথের মতো চেষ্টা করতে পারেন:

'//div[contains(text(), "{0}") and @class="inner"]'.format(text)

ধন্যবাদ ... যাতে এটি বাইরের থেকে অভ্যন্তরকে আলাদা করতে সহায়তা করে, তবে এটি এক্সপথ দিয়ে আসলে কাজ করে, আমি কেবল সমস্ত ডিভাইস দিয়েই পুনরাবৃত্তি করতে সমস্যা হচ্ছিলাম। এক্সপথে আমার সমস্যাটি কী আমি এটি কেস-সংবেদনশীল করতে পারি তা বুঝতে পারি না?
জোশ

2
xpath 2.0 একটি নিম্ন-কেস ফাংশন রয়েছে, সুতরাং এটি কাজ করা উচিত: '// ডিভ [এতে রয়েছে (লোয়ার-কেস (টেক্সট ()), "{0}")]'। ফর্ম্যাট (পাঠ্য)
Andrean

ধন্যবাদ! যদিও, আমার বোঝাটি হ'ল এক্সপথ ২.০ প্রধান ব্রাউজারগুলিতে সমর্থিত নয় ...
জোশ

সেলেনিয়াম এক্সপাথ এক্সপ্রেশনগুলি সরাসরি ব্রাউজারের নিজস্ব পদ্ধতিগুলির সাথে মূল্যায়ন করে, তাই এটি নির্ভর করে যে আপনি কোন ব্রাউজারটি সেলেনিয়াম ব্যবহার করছেন। সাধারণত কেবলমাত্র 6,7 এবং 8 এর এক্সপথ 2.0 সমর্থন করা উচিত নয়।
আন্দ্রেয়ান

.formatআমার গ্রহণে স্বীকৃত নয়। এটি দেয় এবং ত্রুটি। কোন ধারণা, কেন?
অনুজিন

16

আপনি এটি পৃষ্ঠা অবজেক্ট প্যাটার্ন দিয়েও ব্যবহার করতে পারেন, যেমন:

এই কোড ব্যবহার করে দেখুন:

@FindBy(xpath = "//*[contains(text(), 'Best Choice')]")
WebElement buttonBestChoice;

13

// * যে কোনও HTML ট্যাগ অনুসন্ধান করবে। যেখানে কিছু পাঠ্য যদি বোতাম এবং ডিভ ট্যাগের জন্য সাধারণ হয় এবং যদি // * বিভাগগুলি হয় তবে এটি আশানুরূপভাবে কাজ করবে না। আপনার যদি কোনও নির্দিষ্ট বাছাই করতে হয় তবে আপনি এইচটিএমএল এলিমেন্ট ট্যাগ ঘোষণা করে এটি পেতে পারেন। ভালো লেগেছে:

driver.find_element_by_xpath("//div[contains(text(),'Add User')]")
driver.find_element_by_xpath("//button[contains(text(),'Add User')]")

5

উত্সাহের ব্যাপার হল কার্যত সব উত্তর xPath এর ফাংশন কাছাকাছি ঘুরা contains(), আসলে এটা কেস অবহেলা সংবেদনশীল - ওপি এর জিজ্ঞাসা করতে বিপরীত।
যদি আপনার ক্ষেত্রে সংবেদনশীলতা দরকার হয় তবে এটি এক্সপথ 1.0 এ অর্জনযোগ্য (সংস্করণ সমসাময়িক ব্রাউজারগুলির সমর্থন) , যদিও এটি সুন্দর নয় - translate()ফাংশনটি ব্যবহার করে । এটি অনুবাদ সারণি ব্যবহার করে উত্স চরিত্রটিকে তার পছন্দসই রূপটিতে প্রতিস্থাপন করে।

সমস্ত বড় হাতের অক্ষরের টেবিল তৈরি করা নোডের পাঠ্যটিকে কার্যকরভাবে তার নিম্ন () আকারে রূপান্তরিত করবে - কেস-সংবেদনশীল মিলের অনুমতি দেয় (এখানে কেবলমাত্র পূর্বানুমতি রয়েছে) :

[
  contains(
    translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
    'my button'
  )
]
# will match a source text like "mY bUTTon"

পূর্ণ অজগর কল:

driver.find_elements_by_xpath("//*[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZЙ', 'abcdefghijklmnopqrstuvwxyzй'), 'my button')]")

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


এবং যদি আমরা এমন এক পৃথিবীতে বাস করতাম যেখানে ব্রাউজারগুলি এক্সপ্যাথ ২.০ এবং এর বেশি সমর্থন করে (🤞, তবে খুব শীঘ্রই ঘটছে না ☹️) , আমরা ফাংশনগুলি ব্যবহার করতে পারি lower-case()(এখনও, সম্পূর্ণ স্থানীয়-সচেতন নয়), এবং matches(রেজেক্স অনুসন্ধানগুলির ক্ষেত্রে) -সংবেদনশীল ( 'i') পতাকা)।


3

এইচটিএমএল যা আপনি সরবরাহ করেছেন:

<div>My Button</div>

পাঠ্যটি My Buttonহ'ল innerHTMLএবং এর চারপাশে কোনও সাদা জায়গা নেই যাতে আপনি সহজেই text()নীচের হিসাবে ব্যবহার করতে পারেন :

my_element = driver.find_element_by_xpath("//div[text()='My Button']")

দ্রষ্টব্য : text()প্রসঙ্গ নোডের সমস্ত পাঠ্য নোডের বাচ্চাদের নির্বাচন করে


শীর্ষস্থানীয় / পিছনে স্থান সহ পাঠ্য

ধারণকারী প্রাসঙ্গিক পাঠ্য আধারস্থ অনুসরণকারী শূণ্যস্থান শুরুতে করুন:

<div>   My Button</div>

বা শেষে:

<div>My Button   </div>

বা উভয় প্রান্তে:

<div> My Button </div>  

এই ক্ষেত্রে আপনার কাছে 2 টি বিকল্প রয়েছে:

  • আপনি এমন contains()ফাংশন ব্যবহার করতে পারেন যা নির্ধারণ করে যে প্রথম আর্গুমেন্ট স্ট্রিংয়ে দ্বিতীয় আর্গুমেন্টের স্ট্রিং রয়েছে এবং বুলিয়ান সত্য বা মিথ্যা প্রত্যাখ্যান করে:

    my_element = driver.find_element_by_xpath("//div[contains(., 'My Button')]")
  • আপনি এমন normalize-space()ফাংশন ব্যবহার করতে পারেন যা কোনও স্ট্রিং থেকে সাদা-স্থানকে নেতৃত্ব দেয় এবং অনুসরণ করবে, একক স্থান দ্বারা হোয়াইটস্পেসের অক্ষরের ক্রমগুলি প্রতিস্থাপন করবে এবং ফলস্বরূপ স্ট্রিংটি নিম্নরূপে প্রদান করবে:

    driver.find_element_by_xpath("//div[normalize-space()='My Button']]")

ভেরিয়েবল টেক্সটের জন্য এক্সপথ

পাঠ্যটি এমন একটি পরিবর্তনশীল যা আপনি ব্যবহার করতে পারেন:

foo= "foo_bar"
my_element = driver.find_element_by_xpath("//div[.='" + foo + "']")

1
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[contains(text(), 'YourTextHere')]")));
    assertNotNull(driver.findElement(By.xpath("//*[contains(text(), 'YourTextHere')]")));
    String yourButtonName=driver.findElement(By.xpath("//*[contains(text(), 'YourTextHere')]")).getAttribute("innerText");
    assertTrue(yourButtonName.equalsIgnoreCase("YourTextHere"));

1

অনুরূপ সমস্যা: সন্ধান করুন <button>Advanced...</button>

হতে পারে এটি আপনাকে কিছু ধারণা দেবে (দয়া করে জাভা থেকে পাইথনে ধারণাটি স্থানান্তর করুন):

wait.until(ExpectedConditions.elementToBeClickable(//
    driver.findElements(By.tagName("button")).stream().filter(i -> i.getText().equals("Advanced...")).findFirst().get())).click();

0

উপাদানটির সংক্ষিপ্ত সংবেদনশীল অনুসন্ধানের জন্য এর পাঠ্য অনুসারে ড্রাইভার.ফাইন্ড_ইলেটমেন্ট_বি_স্পাথ ব্যবহার করে এবং রেগেক্স ম্যাচিং ফাংশনটি মেলে

driver.find_elements_by_xpath("//*[matches(.,'My Button', 'i')]")

matches()এটি একটি এক্সপথ ২.০ ফাংশন, এবং ব্রাউজারগুলি আফসোস করে কেবল 1.0 এর জন্য সমর্থন করে।
টডর মিনাকভ

-19

এটা চেষ্টা কর. এটা খুব সহজ:

driver.getPageSource().contains("text to search");

এটি আমার জন্য সেলেনিয়াম ওয়েব ড্রাইভারে সত্যই কাজ করেছে।


9
পাঠ্যটি জাভাস্ক্রিপ্ট দ্বারা উত্পাদিত হলে এটি কাজ করে না।
প্যালাসিন্ট

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

আমি ভাবব যে ব্রাউজারটি রেন্ডার করার জন্য পুরো পৃষ্ঠার উত্সটি ইতিমধ্যে তারের উপর দিয়ে স্থানান্তর করা দরকার?
রেনি

3
জোশ জিজ্ঞাসা করছে যে পাঠ্য দ্বারা উপাদানটি কীভাবে সন্ধান করা যায়, পৃষ্ঠার উত্সটিতে পাঠ্য উপস্থিত রয়েছে কিনা তা পরীক্ষা না করে।
সিড্রিক

1
উদাহরণস্বরূপ যেখানে সমস্ত প্রয়োজন তা হ'ল কোনও পৃষ্ঠায় একটি স্থির পাঠ্য সন্ধান করা এই সমাধানটি যথেষ্ট ভাল। (এটি আমার ক্ষেত্রে সহায়তা করেছে)।
কার্ল্থ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.