2016-12-28 1 views
1

私はPythonで一連のセレンテストを行っています。xpathを変更すると、セレンのクリックが一貫して行われるのはなぜですか?

<ul> 
<li class="has-sub"> 
    <a href="#"> 
     <span> First nav </span> 
    </a> 
     <ul style="display:block"> 
     <li> 
      <a href="#"> 
       <span> First subnav </span> 
      </a> 
     </li> 
     <li>...</li> 
     <li>...</li> 
     <li>...</li> 
     </ul> 
</li> 
<li>...</li> 
</ul> 

は今、私はそれが最初のスパンで、最初のsubnavをクリックしていますが、最初にそのリストを開くためにまずNAVをクリック:私は、私はこのような構造を持っているテストですページのナビゲーションを持っていますsubnav。私は私を作った、NAVをクリックした後、私は頻繁に表示されるようにsubnavスパンのを待つタイムアウトの例外を得た

//span[1] 

、要素が見えるようにするのを待ち、それはXPathのだ経由して、それをクリックして、webdriverwaitを実装しますリストを開くために最初のナビゲーションをクリックして何かが間違っていたと思う。だから私は(スパン[1] //)

//li[@class='has-sub']/descendant::span[text()='First subnav'] 

に最初のナビゲーションのXPathを変更し、subnavスパンが表示されるようになるのを待つとき、私はタイムアウト例外を取得することはありません。だから、毎回ナビスパンをクリックしてそれを開いて、サブナビに行くときにタイムアウトを与えないように思えます。誰でも、なぜそれが何か考えている?ここ

は私のPythonコードでもある:

LoadCommPageクラス内:

def click_element(self, by, locator): 
    try: 
     WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((by, locator))) 
     print "pressing element " + str(locator) 
     self.driver.find_element(by, locator).click() 
    except TimeoutException: 
     print "no clickable element in 10 sec" 
     print self.traceback.format_exc() 
     self.driver.close() 

メインテスト(load_comm_pageがclick_clementが定義されているLoadCommPageのインスタンスである)の内側:

load_comm_page.click_element(*LoadCommPageLocators.sys_ops_tab) 

ロケータの別のクラス:

class LoadCommPageLocators(object): 
firstnav_tab = (By.XPATH, "//li[@class='has-sub']/descendant::span[text()='First nav']") 
+0

コードを共有することはできますか? – Hisagr

+0

オリジナルの投稿に追加 –

答えて

1

するXPathインデックスは1から始まり、0でないので、Xpathの

//span[1] 

は、HTMLの最初のspan要素を探しています。一方、

//span[2] 

は、第2スパンを探します。

+0

本当に、知っておきたい。それは私が見た振る舞いを説明するものではありません。時には、正しい要素をクリックしたり、何もクリックしない(タイムアウトする)こともあります。 DOMの次のスパンをクリックしないでください。 –

関連する問題