2017-11-13 15 views
0

以下のコードを使用して、Webページのドロップダウンからオプションを選択する際に、セレン(python)を使用しようとしています。pythonセレニウム - ドロップダウンからオプションを選択する

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

path_to_chromedriver = 'C:/Users/User_1/chromedriver/chromedriver' 
browser = webdriver.Chrome(executable_path = path_to_chromedriver) 

url = 'https://lifeinsurance.rac.com.au/rac/get-a-quote?productid=51' 
browser.get(url) 

wait = WebDriverWait(browser, 10) 

# residence listbox 
drop_down = browser.find_element_by_xpath('//*[@id="divApplicantDetails__1"]/div[8]/div/div[2]/span/span/span[1]') 

browser.execute_script('arguments[0].style.display="inline";', drop_down) 
wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="divApplicantDetails__1"]/div[8]/div/div[2]/span/span/span[1]'))) 

wait.until(EC.element_to_be_clickable((By.XPATH, r'//*[@id="ddResidentialStatusId__1_listbox"]/li[1]'))).click() 

あり、それが動作する機会がある(とドロップダウンからオプションが選択されている)が、他の機会にドロップダウンからオプションを選択(およびエラーがいずれかの発生しません)ではありません。

提供されたコードに記載されているドロップダウンからオプションを一貫して選択する方法についてのご意見をお待ちしております。

+3

あなたはそれがあるべきよりも、それはより複雑になって - 、選択クラスを見てくださいhttp://selenium-python.readthedocs.io/navigating.html#filling-in-forms – SAZ

+1

ポストへのリンクページまたは関連するHTML – JeffC

+1

ありがとう@JeffC - ページへのリンクは、** url ** – Marley

答えて

1

要素のCSSを操作しようとしません。ユーザーのようにアプローチするだけです...ドロップダウンをクリックし、オプションをクリックします。私は別のロケータを使用しましたが、これは私のために働いた。

driver.find_element_by_css_selector("span[aria-owns='ddResidentialStatusId__1_listbox']")).click() 
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#ddResidentialStatusId__1_listbox > li"))) 
options = driver.find_elements_by_css_selector("#ddResidentialStatusId__1_listbox > li")) 
options[0].click() # clicks "Australian citizen or permanent resident" 

Javaはので、私はそれらのすべてを取得し、その後、単一の要素を待ち、その後、最初のものをクリックしなければならなかったんようにPythonはvisibilityOfAllElementsLocatedBy()を持っていません。あなたが本当に最初のものをクリックしたいのであれば、できるだけです。

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#ddResidentialStatusId__1_listbox > li"))).click() 

そして最後の2行のコードをスキップしてください。私はあなたが(あなたに働いているジェダイのマインドパワーが)これを関数に投げて別のオプションを選択したいと思っているので、それをそのまま残しました。

1
def select_resident_status(resident_status): 
    // click the arrow down to make all options list out 
    driver.find_element_by_css_selector('span[aria-owns*="ResidentialStatus"] span.k-select').click() 

    // select option by pass-in option text 
    driver.find_element_by_css_selector('div[id*="ResidentialStatus"][style*="display: block"] ul') 
      .find_element_by_xpath('./li[text()="'+resident_status+'"]').click() 
+0

これは理論的には質問に答えることができますが、コードの説明とその質問に対する回答の説明を含めることが望ましいでしょう。 – JeffC

1

まず、あなたは常にクリック可能である選択ボックスをクリックすることができます次に

driver.find_element_by_xpath("//span[@class='k-input' and text()='Select residential status']").click() 

在留資格のリストが表示されている場合にのみ、あなたが希望の項目をクリックすることができます(ARIA-隠さ=「偽」)

動作するために
driver.find_element_by_xpath("//ul[@id='ddResidentialStatusId__1_listbox' and @aria-hidden='false']/li[@class='k-item' and text()='Other']").click() 

、このソリューションは、あなたのスクリプトを待つimplictセットアップに必要

driver = webdriver.Chrome(executable_path = path_to_chromedriver) 
driver.implicitly_wait(5) 

編集:私はより多くのテストを行い、このソリューションは毎回動作しません。ですから、これを避けることが望ましい場合でも小さな休止を追加することをお勧めします。この場合、リストボックスを完全にレンダリングできるようにするためにしか使用されていないので、破損しないと思います。

driver.find_element_by_xpath("//span[@class='k-input' and text()='Select residential status']").click() 
driver.find_element_by_xpath("//ul[@id='ddResidentialStatusId__1_listbox' and @aria-hidden='false']") 
time.sleep(1) 
driver.find_element_by_xpath("//ul[@id='ddResidentialStatusId__1_listbox' and @aria-hidden='false']/li[@class='k-item' and text()='Other']").click() 
関連する問題