我在一个页面中有1200行的列表,我根据某些条件选择行。大多数情况下,我的情况发生真实1000次,所以硒试图逐个选择1000行,但有时候选择500,有些时间800,有些时间1000.有什么方法可以让它稳定吗?
当我检查我的情况时,它总是有正确的大小来选择行。但是硒不能一直以相同的方式工作。
代码:
public static List<String> listOfData;
public static int x=0;
driver.get(URL);
WebDriverWait wait = new WebDriverWait(driver, 60);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(Xpath1)));
List<WebElement> TRcount = driver.findElements(By.tagName("tr"));
System.out.println(TRcount.size());
List<WebElement> TDcount = null;
if(TRcount.size()>0)
{
for(int i=2;i<TRcount.size();i++)
{
listOfData = new ArrayList<String>();
TDcount = TRcount.get(i).findElements(By.tagName("td"));
for(int j=0; j<TDcount.size(); j++)
{
if(TDcount.get(j).getText().equals("Loading..."))
{
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
listOfData.add(TDcount.get(j).getText());
}
if(TDcount.size()>0)
{
if(GlobalMethods.checkIfDataExists((listOfData)))
{
listOfTrueId.add(i);
x++;
}
}
}
int count=2;
for(int k = 0; k <= listOfTrueId.size(); k++)
{
Thread.sleep(3000);
TRcount.get(count).click();
//System.out.println(TDcount.get(0).getText() +" : "+ "Pass");
//TDcount.get(0).click();
count++;
}
}
这里 listOfTrueId 是我的数组,它只存储没有。 ids来获取所有行。所以大多数情况下,我认为它的大小接近1000,这是正确的。
TRCount 始终是正确的。问题是它检查数据的条件是否存在,并在 listOfTrueId
中执行++TRcount 也是列表元素,帮我计算TR从1到
但是当它循环选择行时,它会随时停止。据我了解我的浏览器,它一次显示12行,从下一个selenium自动逐个向下滚动但随后它停在任何一行。
更新:
我刚才知道这个问题是TD标签数据加载,当它开始加载数据时,它有文本名为&#34;正在加载...&#34; ,所以我的脚本获取这个&#34;正在加载...&#34; 作为TD的值,并根据它选择较少的行。那么如何告诉我的脚本,如果TD的值是&#34;正在加载...&#34; ,请等待一段时间再次检查相同的TD以获取实际数据。< / p>
我已经在上面的脚本中进行了隐式等待,但这似乎没有帮助。
答案 0 :(得分:1)
在driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
您实际上没有等待,您只需设置驱动程序尝试在driver.findElement
中找到元素的时间。
尝试更改
if(TDcount.get(j).getText().equals("Loading..."))
{
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
其中一个:
如果您有定位器
//Explicit wait
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.invisibilityOfElementWithText(By locator, "Loading..."));
如果文本正在更改为所有元素中的相同文本
//Explicit wait
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.textToBePresentInElement(TDcount.get(j), someText));
或者只是等待循环
long start = System.currentTimeMillis();
while ((System.currentTimeMillis() - start) / 1000 < 30 && TDcount.get(j).getText().equals("Loading..."));