2017-05-24 3 views
0

Unten ist mein HTMLnicht in der Lage Radioknopf Element durch XPath in Selen mit Python

<div id="slectrole" class="collapse in" role="tabpanel" aria-labelledby="selectrole"> 
<div class="panel-body"> 
<div class="dropdown"> 
<input class="search-control jsSayt jsRolesFreeText" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Eg: Delivery, BPO, Driver'" placeholder="Eg: Delivery, BPO, Driver" value="" aria-expanded="false" aria-haspopup="true" data-toggle="dropdown" type="text"> 
<ul class="jsSaytList jsRolesFilter"> 
<li id="jsFilter_subRole_1" class="checkbox-inline jsFilterSubRole jsRoleValue_1" data-value="Accountant"> 
<input id="Accountant" class="radio-custom jsFilterRadio jsRole" value="Accountant" name="Role" data-roleid="1" type="radio"> 
<label class="radio-custom-label" for="Accountant">Accountant</label> 

Unten ist der Code, ich bin mit dem Radio-Button klicken, klicken:

wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@id='slectrole']/descendant::li[@data-value='Accountant']/label[@for='Accountant']"))) 


driver.find_element_by_xpath("//div[@id='slectrole']/descendant::li[@data-value='Accountant']/label[@for='Accountant']").click() 

Der Code läuft ok, aber es wählt nicht den Radio-Button.

+0

Sie klicken auf die '

+0

// div [@ class = 'stickySearch']/div [@ id = 'jsSideFilters']/ul [@ id = 'Akkordeon']/li [@ id = 'jsFilter_roles']/div [@ class = 'collapse in ']/div [@ class =' ​​Panel-Körper ']/div [@ Klasse =' Dropdown ']/ul [@ class =' ​​jsSaytList jsRolesFilter ']/li [1]/Eingabe [@ value =' Buchhalter ' ] – user8040338

+0

// div [@klasse = 'stickySearch']/div [@ id = 'jsSideFilters']/ul [@ id = 'akkordeon']/li [@ id = 'jsFilter_roles']/div [@ class = ' collapse in ']/div [@ class =' ​​panelkörper ']/div [@ class =' ​​dropdown ']/ul [@ class =' ​​jsSaytList jsRolesFilter ']/li [1]/label [@ für =' Buchhalter '] – user8040338

Antwort

0

OK, damit ich Ihre Frustration verstehen kann, habe ich Ihren Code versucht und war nicht in der Lage .click() (wählen) das Element, wenn über xpath gefunden. Siehe unten print-screen: enter image description here Wie Sie sehen können, es wurde nur die radio-button klicken, wenn ein .click() über ein CSS -Befindet Element ausgegeben wird.

Frage Nr. 1: Sind Sie auf die eine oder andere Weise an die Locator-Strategie xpath gebunden?

Wenn nicht, dann verwenden Sie einfach eine Regel CSS Selektor: 'input[id="Accountant"]'. Andernfalls müssen Sie herausfinden, was mit der Website, die Sie testen, falsch ist, oder zu einer anderen WebElement Locator-Strategie wechseln. (ZB: ID, Class, CSS, LinkText, etc.)

Wenn Sie mit der CSS Locator-Strategie gehen würden entscheiden, dann wird Ihr Code würde wie folgt aussehen:

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "label[for='Accountant']"))) 
driver.find_element_by_css("input[id='Accountant']").click() 

Alternativ Sie können versuchen, auf den <label> Tag an die radio-button an zu klicken, die in meiner Konsole auf die gleiche Weise funktioniert:

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "label[for='Accountant']"))) 
driver.find_element_by_css("label[for='Accountant']").click() 

Erklärung: In einem realen Szenario können Sie die radio-button sowohl über den tatsächlichen Radio-Knopf oder über sein Etikett auswählen. Deshalb hat Ihre Lösung funktioniert.

Frage Nr.2: Warum verwenden Sie so lange xpath Selektor?

Um einen optimalen Wähler zu haben, sollten Sie IMMER gehen mit der kürzesten, Kombination von Tags/Attribute, wird UNIQUELY Ihr Zielelement zu identifizieren. Sonst sind Sie anfällig für Website-Änderungen, flockige Testfälle, etc.

+0

AttributeError: Typ Objekt 'By' hat kein Attribut 'CSS' – user8040338

+0

Ich benutze Python und selen webdriver: \t wait.until (EC.visibility_of_element_located ((Von.CSS, "label [für = 'Buchhalter']"))) driver.find_element_by_css_selector ("input [id = 'Buchhalter']").) – user8040338

+0

Ich bin neu in Selen und habe eine harte Zeit mit Xpath.I versuchte lange Xpath nur um sicherzustellen, dass ich in der Lage bin, das richtige Element zu wählen.Ich brauche nicht Xpath.Ich kann CSS oder irgendetwas anderes, das funktioniert – user8040338

0

Sie können den Klick auf das Dropdown-Menü ausführen und warten, bis das Optionsfeld angezeigt wird, bevor Sie darauf klicken. Daher versuchen Sie folgendes:

driver.find_element_by_xpath("//div[@id='slectrole']/div/div[@class='dropdown']/input[1]")).click() 
wait = WebDriverWait(driver, 10) 
wait.until(EC.visibility_of_element_located((By.XPATH, '//div[@id='slectrole']/descendant::li[@data-value='Accountant']/input[1]'))) 
driver.find_element_by_xpath("//div[@id='slectrole']/descendant::li[@data-value='Accountant']/input[1]").click() 

Lassen Sie mich wissen, ob der obige Code für Sie funktioniert.

+0

Lassen Sie mich wissen, wenn Sie Fragen haben. – Mahipal

+0

Ich habe diesen Code versucht, aber es funktioniert nicht.Ich erhalte keinen Fehler, aber es immer noch nicht auf den Radio-Button @Mahipal – user8040338

+0

Klicken Sie auf das Drop-down-Menü und Optionen erschienen? – Mahipal

Verwandte Themen