解决问题我有点困难。我正在寻找一个名为' _1VfKB'的课程的所有元素。在这个元素的内部,带有一个'数据图标'作为一个属性。我正在使用while循环,所以如果数据图标收到值X它继续运行,否则它结束循环(while)。但是,当我的情况被触发时,我该如何打破这段时间?
private void CheckIfMsgSent() {
while (true) {
IReadOnlyCollection < IWebElement > els = driver.FindElementsByClassName("_1VfKB");
foreach(IWebElement el in els) {
IWebElement span = el.FindElement(By.TagName("span"));
if (span.GetAttribute("data-icon") == "status-time") {
Thread.Sleep(1000);
break;
}
/* If no element is found with the data-icon = "status-time", break while and break foreach*/
}
}
}
答案 0 :(得分:0)
在某些语言(如PHP)中,你可以break 2
打破两个循环......但是在C#中,为了清晰的代码,你最好还是让你的代码更具可读性。例如。添加&#34; continueLooking&#34;变量
关于你如何突破两次的逻辑是令人困惑的,因为你把评论INSIDE循环。这对我有用的唯一方法就是让它在循环之外...否则你每次都会在第一次迭代中存在循环...所以最好理解我可以集合的代码,我认为它应该是这样的:
private void CheckIfMsgSent() {
var continueLooking = true;
bool foundElement;
while (continueLooking) {
foundElement = false;
IReadOnlyCollection < IWebElement > els = driver.FindElementsByClassName("_1VfKB");
foreach(IWebElement el in els) {
IWebElement span = el.FindElement(By.TagName("span"));
if (span.GetAttribute("data-icon") == "status-time") {
Thread.Sleep(1000);
foundElement = true;
break;
}
}
if( !foundElement ) {
continueLooking = false;
}
}
答案 1 :(得分:0)
在开始之前分配一个变量,然后在其中,你有你的意见,改变那个变量的状态。
开始于:
bool loopState = true;
while(loopState)
{
bool found = false;
if (span.GetAttribute("data-icon") == "status-time") {
found = true;
Thread.Sleep(1000);
break;
}
然后你有这个评论:
/* If no element is found with the data-icon = "status-time", break while and break foreach*/
添加:
if(!found)
loopState = false;
这会在成功时打破内循环,但保持外循环运行。但是如果你点击了所有元素并且不匹配,那么你的While循环的下一次迭代将不会执行,因此你的Foreach也不会执行。