2016-12-06 3 views
2

私はorderとsearchValueが必須のパラメータであり、actionとbuttonNameはオプションです。私は検索を実行した後、この機能を使用しています。この機能により、ユーザーはパラメータに基づいてさまざまなことを行うことができます。たとえば、チェックボックスをクリックすると(行のどこにでもあります)、開いているボタンをクリックします(行のどこでも)。Selenium Python与えられたパラメータに基づいてテーブル行からテーブルデータを選択します

ここにはtr (3つの結果復帰後)のようになります。これは私がWRコードの一部である

enter image description here

(TDは、チェックボックス、ボタンなどすることができます)TR内側TDここ

enter image description here

をしています私はそれをより良い方法で書くことができるかどうかを知りたがったり、xpathパスを何度も定義する必要はありません。

ここで、ユーザーはorder(FirstまたはLast(tr))とsearchValueを定義し、そのテキストでtdを検索し、同じtr(順序に応じて)でアクションを実行します。

def listView(self, order, searchValue, action=False, buttonName=False): 
     if order = 'First': 
      #self.find_element("//*[starts-with(@id,'table_')]/tbody/tr") 
      self.find_element('//*[starts-with(@id,"table_")]/tbody/tr[1]/td[text()= "'+ searchValue +'"]') 
      if action == "Link": 
       self.click(10, "//*[starts-with(@id,'table_')]/tbody/tr[1]") 
      elif action == "Checkbox": 
       self.click(10, '//*[starts-with(@id,"table_")]/tbody/tr[1]/td/input[@type="checkbox"]') 
      elif action == "Button" and buttonName: 
       self.click(10, '//*[starts-with(@id,"table_")]/tbody/tr[1]/td/input[@type="Button"]/@value["'+ buttonName +'"]') 
      else: 
       raise Exception("Invalid value for action parameter") 

     elif order = 'Last': 
      self.find_element('//*[starts-with(@id,"table_")]/tbody/tr[last()]/td[text()= "'+ searchValue +'"]') 
      if action == "Link": 
       self.click(10, "//*[starts-with(@id,'table_')]/tbody/tr[last()]") 
      elif action == "Checkbox": 
       self.click(10, '//*[starts-with(@id,"table_")]/tbody/tr[last()]/td/input[@type="checkbox"]') 
      elif action == "Button" and buttonName: 
       self.click(10, '//*[starts-with(@id,"table_")]/tbody/tr[last()]/td/input[@type="Button"]/@value["'+ buttonName +'"]') 
      else: 
       raise Exception("Invalid value for action parameter") 

     else: 
      raise Exception("Invalid value for order parameter") 

答えて

1

あなたは本当にPage Object patternを使用してみてください - ページの定義、ページ上の要素と使用可能なアクションを見つける方法を抽象化ページオブジェクトなどのページの一部。

たとえば、あなたのケースでは、あなたが別のオブジェクトとして定義されたテーブルの行を持っているかもしれませんが:

INDEX_MAP = { 
    'First': '1', 
    'Last': 'last()' 
} 

class RowElement(object): 
    def __init__(self, driver, index): 
     if index not in INDEX_MAP: 
      raise ValueError("Invalid index %s" % index) 

     self.driver = driver 
     self.row = self.driver.find_element_by_xpath("//*[starts-with(@id,'table_')]/tbody/tr[%s]" % INDEX_MAP[index]) 

    def click_checkbox(self): 
     self.row.find_element_by_xpath('./td/input[@type="checkbox"]').click() 

    def click_button(self, name): 
     self.row.find_element_by_xpath('./td/input[@type="Button" and @value = "%s"]' % name).click() 

次に、あなたがこの方法このRowElementクラスを使用することができます。

row = RowElement(driver, 'First') 
row.click_checkbox() 
row.click_button("Apply") 

row = RowElement(driver, 'Last') 
row.click_checkbox() 
row.click_button("Apply") 
+0

偉大これがそうですずっときれい。すごく感謝します。 – user7242550

+0

ちょうど最後の質問、私はパラメータを使用してxpathを書いた方法 - '/ * [開始 - with(@id、 "テーブル_")]/tbody/tr [1]/td/input [@ type = "ボタン "]/@値[" '+ボタン名+']]をクリックします。これは良い方法ではありませんか? – user7242550

+0

@ user7242550ええ、ボタンを "value"属性で照合したいのであれば、これは正しい方法ではありません。ありがとう。 – alecxe

関連する問題