2016-11-11 42 views
1

这将是一个容易为别人一个下拉列表中选择一个选项后找到的元素,变成了很长的帖子什么,我认为这是一个简单的问题。无法从使用Python,硒和ActionChains

我刮供应商的网站,并写入到CSV,这样我就不必通过页面和产品页面手动苦干。为了获得产品列表,我运行了一个没有变量的搜索并获得了很多。但是,如果我尝试使用下拉选项将我的搜索限制在库存产品中,我的代码就会出现问题。

由于这是一个第三方网站,我不能改变的HTML。下面是从该网站的HTML片断(因为它重新格式化抄非常难看):

<tbody id="adv_search_box"> 
    <tr> 
     <td class="data-name">Search in category:</td> 
     <td class="data-input" colspan="2"> 
     <select name="posted_data[categoryid]" class="adv-search-select"> 
      <option value="">&nbsp;</option> 
      <option value="257">Hot New Arrivals</option> 
      <option value="252">In-Stock</option> 

...

 <button class="button main-button" type="submit" title="Search"> 
      <span class="button-right"><span class="button-left">Search</span></span> 
     </button> 
     </td> 
    </tr> 
</tbody> 

当我使用下面点击搜索按钮,我得到的一切供应商不考虑地位。因此,这只是正常:

searchButton = driver.find_element_by_xpath('//*[@id="adv_search_box"]/tr[8]/td[2]/button/span/span') 
actions = ActionChains(driver) 
actions.move_to_element(searchButton) 
actions.click(searchButton) 
actions.perform() 

然后我添加代码以选择按钮,单击代码前的“存货”选项:

#Select in-stock on search page 
InStockSelection = driver.find_element_by_xpath('//*[@id="adv_search_box"]/tr[1]/td[2]/select/option[3]') 
actions = ActionChains(driver) 
actions.move_to_element(InStockSelection) 
actions.click(InStockSelection) 
actions.perform() 

#Click button 
searchButton = driver.find_element_by_xpath('//*[@id="adv_search_box"]/tr[8]/td[2]/button/span/span') 
actions = ActionChains(driver) 
actions.move_to_element(searchButton) 
actions.click(searchButton) 
actions.perform() 

我收到以下错误:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="adv_search_box"]/tr[8]/td[2]/button/span/span"} 

最后一个音符。我意识到这可以以更简洁,更紧凑和更优雅的方式进行编码。它是这样编码的,因为我不会再看它,直到它破裂(即供应商改变他们的网站),并且如果它被编码像我六岁那样,我就能弄清楚我是什么从现在开始做了几年。

谢谢大家的帮助。

编辑1:在我看来,简单的xpath解决方案将无法正常工作。在伪编码喋喋不休,我认为该程序专注于下拉表,并不能看到其余的HTML。如果我可以重新将注意力集中在整个页面上,它应该可以工作。

解决方案:编程是我喜欢的魔术。这通常是你没有看的,这是你需要注意的一点。在这种情况下,选择按钮的代码没有任何问题。问题在于用于选择下拉选项的代码无法正常工作,并且最后的点击更改了页面焦点。

的解决方案是更改的选项位于避免操作链的方式。

driver.find_element_by_xpath("//select[@name='posted_data[categoryid]']/option[text()='In-Stock']").click() 

在此文章中找到的帮助:Selenium - Python - drop-down menu option value

谢谢MikeJRamsey56,为说服我抛弃的行动链,并感谢您dejavu_cmd_delt抽出时间来回答。

回答

0

我会建议使用下面的XPath,因为它是免费的索引麻烦的,假设只有一个在所有tr

searchButton = driver.find_element_by_xpath('//*[@id="adv_search_box"]//button[@title="Search"]//span[@class="button-left"]) 
+0

都能跟得上按钮,没有工作。即使当我在缺失的结尾单引号中加入时也是如此。 ;-) – NickV