2017-02-21 63 views
0

我在Python3中使用硒,我正在努力填寫調查問卷。在本調查問卷中,我將遍歷所有問題並回答問題。我的問題是弄清楚我正在處理的是什麼類型的問題,無論問題是多選還是文本問題。我想這樣做的是類似以下內容:有沒有辦法比較XPath來確定正在查看的元素類型?

while questionsLeft: 
    if currentQuestion == textQuestion: 
     answerAsTextQuestion() 
    elif currentQuestion == multChoice: 
     answerAsMultChoice() 

但我在實施這一點,因爲我不知道如何驗證,如果我看的元素是文本框或麻煩多選題。以下是分別用於文本問題和多選題的HTML。

我到目前爲止是以下內容,都沒有條件通過,所以它每次都會直接進入下一部分。

self.set_filter("unanswered") 

    all_sections = AssessmentSection(self.driver).get_all_section_names() 
    print(all_sections) 

     i = 1 
     self.driver.implicitly_wait(3) 

     for element in self.driver.find_elements_by_xpath('(//div[@bo-if])'): 
      self.driver.implicitly_wait(3) 
      print("in for loop at " + all_sections[j]) 
      if element.get_attribute("bo.if") == "questionResponse.question.type === 'TextQuestion'": 
       print("found text question") 
       self.driver.find_element_by_xpath('.//pre[@class="textareaClone"]//div').send_keys(XpathData.test_string) 
       self.driver.find_element_by_xpath('.//pre[@class="textareaClone"]//div').send_keys(Keys.TAB) 
       i += 1 
      elif element.get_attribute(
        "bo.if") == "questionResponse.question.type === 'SingleSelectQuestion' || questionResponse.question.type === 'PolarQuestion'": 
       print("found choice question") 
       self.driver.find_element_by_xpath(
        './/*[@id="ng-app"]/body/div[1]/div[3]/div/div/div[2]/div[3]/div[' + str(
         i) + ']/div/div/div/div[2]/div[1]/label').click() 
       i += 1 


     Wait(self.driver, Wait.timeout).until(EC.visibility_of_element_located((By.XPATH, '//div[contains(text(), \'' + all_sections[j] + '\')]'))) 
     self.driver.find_element_by_xpath('//div[contains(text(), \'' + all_sections[j] + '\')]').click() 
     j += 1 
     print(j) 
+1

你能分享兩個元素的HTML樣本嗎?還分享'questionsLeftInQuestionnaire()'的代碼' – Andersson

+0

爲元素添加了HTML。截至目前questionsLeftInQuestionnaire()有一個遍歷所有問題的循環,當迭代器沒有任何剩餘的問題可供引用時拋出異常。 – TheOneTrueSign

回答

1

當你的questionsLeftInQuestionnaire()邏輯是隱藏的代碼下面是簡化版本,你可以實現:

for element in driver.find_elements_by_xpath('//div[@bo-if]'): 
    if element.get_attribute("bo.if") == "questionResponse.question.type === 'TextQuestion'": 
     answerAsTextQuestion() 
    elif element.get_attribute("bo.if") == "questionResponse.question.type === 'SingleSelectQuestion' || questionResponse.question.type === 'PolarQuestion'": 
     answerAsMultChoice() 

如果屬性bo-if的值對每個元素的不同,你可以嘗試使用if "||" in element.get_attribute("bo.if")條件

+0

我添加了我的完整代碼,我相信我遇到的問題不是解決任何問題類型(multChoice和Text) – TheOneTrueSign

+0

代碼的輸出是什麼?哪條線似乎是你的問題的原因?你可以分享頁面的URL嗎?或者它是保密的? – Andersson

+0

用我現在的代碼沒有錯誤。基於代碼在每個部分中運行的邏輯,認爲沒有更多的問題需要回答。也就是說,它從第1部分開始,沒有留下任何問題要回答(這是錯誤的),並轉到下一部分並繼續到最後一部分。恐怕'URL'是保密的,我的道歉。 – TheOneTrueSign

相關問題