如何查找所有元素并一个接一个地单击它们

时间:2019-07-11 10:00:31

标签: java selenium selenium-webdriver automation ui-automation

我正在建立一个最终项目,却陷入一个问题。 网站:trello.com 我有一个页面,其中包含带有创建的板的按钮和用于创建板的按钮。

我尝试存储所有这些按钮,然后按文本找到它们并单击它们。

问题是这样,我设法访问了所有按钮,但无法单击它们 例如:有三个按钮(参见图片),第三个按钮是“创建新板”。 根据控制台,我可以导入他的文本,但是不能单击它(命令单击后什么也没有发生)。 我是菜鸟,所以希望我已列出所有内容,并乐意为您提供帮助。

这是我的代码:

trello页面上有板子的图片。 https://ibb.co/kmV6V4n

private By mainBoardSelectorList = By.xpath("//*[@id=\"content\"]/div/div[2]/div/div/div/div/div[2]/div/div/div/ul");

public WebElement getMainBoardSelectorList() {
        return driver.findElement(mainBoardSelectorList);
}

   @Test
    public void getAllBoardsAndClick(){

        methodsManager.logIn();
        BoardsPage boardsPage = new BoardsPage(driver);
        System.out.println(boardsPage.getMainBoardSelectorList().getText());
        WebElement el = boardsPage.getMainBoardSelectorList();
        if (el.getText().contains("Create new board")){
            el.click();
        }
    }

2019年7月11日下午12:42:26 org.openqa.selenium.remote.ProtocolHandshake createSession INFO:检测到的方言:OSS hj, 无标题板 创建新板子

3 个答案:

答案 0 :(得分:0)

  1. 再次检查您的选择器,因为它可能与不可点击或不可点击但没有结果的东西匹配。使用browser developer tools找出匹配项,因为您可能会得到假阳性结果
  2. 可以像这样定位元素by partial link text

    driver.findElement(By.partialLinkText("Create new board"));
    
  3. findElements() function会返回List的WebElements,它更适合您的用例
  4. 请注意,一旦单击链接并离开页面,所有WebElement都将失效,并且您将获得StaleElementReferenceException,因此请考虑在返回后重新执行“查找”操作,或者更好地执行用于Page Object Model design pattern,该元素在定位元素时实施了lazy initialization策略。

答案 1 :(得分:0)

您需要点击li标签而不是ul 您可以将函数getMainBoardSelectorList()更改为返回 List<WebElement>代替WebElement

public List<WebElement> getMainBoardSelectorList() {
        return driver.findElement(mainBoardSelectorList).findElements(By.tagName("li")));
}

现在,您的方法将返回您需要的所有li个元素(板)。 我认为“创建新板”始终是最后一个,您可以这样做

List<WebElement> els = boardsPage.getMainBoardSelectorList();

els.get(els.size() - 1).click());

别忘了处理异常

答案 2 :(得分:0)

my_methods = {
    "modify": modify,  # they keys are the same as provided in the choices in the argument parser
    "add": add_task,
    "cook_a_turkey": cook_that_turkey,
}
# And you can call the function like this: However you will have to change a bit your functions to parse the arguments in each of them.
my_methods[parser.option]("csv", args)

# For instance the modify will become:
def modify(filename, args):
    taskids = list(map(int, args.select))
    # ...
def add_task(filename, args):
    # do stuff
def cook_that_turkey(filename, args):
    # your grandma recipe