无法使用Selenium选择md-select下拉选项

时间:2016-09-22 19:30:26

标签: angularjs python-3.x selenium material-design angular-material

我有一个带有一组选项的角度材料下拉列表,我试图选择其中一个选项。我选择它们如下:

html文件:

<md-select name="myDropdown"
           ng-model="addCompany.details.someModel"
           ng-change="addCompany.swapDisplayedAreas()"
           required>

    <md-option value="Company A">Company A</md-option>
    <md-option value="Company B">Company B</md-option>
</md-select>

python test:

input = self.browser.find_element_by_name('myDropdown')
input.click()
choice = self.browser.find_element_by_xpath("//*[contains(text(), 'Company A')]")
choice.click()

但是,无论我如何尝试选择该选项,我都会收到以下错误:

  

selenium.common.exceptions.WebDriverException:消息:元素不是       可点击(750,423)。其他元素将收到点击:       <md-backdrop style="position: fixed;" class="md-select-backdrop md-click-catcher ng-scope"></md-backdrop>

或者我可以看到该元素被点击,但下拉列表仍然被拉出。在下拉列表仍然被拉出时尝试点击页面上的任何其他元素会给出类似的md-backdrop会收到点击错误。

知道如何选择md-select元素的下拉列表选项吗?我尝试为我的输入元素禁用md-backdrop但没有成功。

2 个答案:

答案 0 :(得分:2)

您应该尝试使用WebDriverWait等待,直到选项从下拉列表中打开并在点击之前变为可见和可点击,如下所示: -

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

#find dropdown and click to open options 
input = self.browser.find_element_by_name('myDropdown')
input.click()

#now wait until options getting visible and clickable 
choice = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "md-option[value = 'Company A']")))
choice.click()

答案 1 :(得分:0)

我猜这个问题可能是以下之一:

  1. 页面上有另一个元素,其中包含文本“Company A”,即使下拉选项显然是您希望selenium单击的元素,也会尝试单击该元素。这是因为selenium单击满足标识符的第一个元素。要检查这是否是问题,我将使用find元素并检查找到的元素数量。如果这是问题,请尝试使用css选择器,例如value。

  2. 如果您使用的是Chrome,我在测试角度应用程序时遇到了与chrome webdriver类似的问题。

  3. 这是问题https://code.google.com/p/selenium/issues/detail?id=2766 我尝试了优雅的解决方法,但没有任何效果......最后我使用了Lukeis的解决方案。

    在java中

    int n=10;
        String errorMessage;
        for (int i=1; i<=n; i++)
        {
            try {
                clickThis.click();
                break;
            } catch(WebDriverException driverException) {
                Thread.sleep(1000);
                errorMessage = driverException.toString();
            }
            if(i==n)
            {
                Assert.fail("Failed to click "+n+" times \n" + errorMessage);
            }
        }
    

    它几乎试图点击该元素10次。