我使用下面的代码来查找框架中的元素,但是我收到了错误 请通过这个framebyinedex,framebystring,framebywebelement:
来解释import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class Framebyindex
{
public static void main(String[] args)
{
WebDriver f1=new FirefoxDriver();
f1.get("http://spicareers.com/spicareers/");
f1.switchTo().frame(1);
f1.findElement(By.linkText(" .Net - Senior Developer ")).click();
}
}
错误是:
线程中的异常" main" org.openqa.selenium.NoSuchElementException:无法找到元素:{"方法":"链接文本","选择器":" .Net - 高级开发人员"}
答案 0 :(得分:1)
NoSuchElementException
只是意味着,selenium没有检测到您提出的文本链接。
我建议您使用by.xpath
来解决它。要获取元素的xpath,请在chrome
或firefox
浏览器上执行以下步骤。
右键单击元素(此处为链接)
点击inspect
。它会在浏览器中打开检查控制台(Elements选项卡),并突出显示单击的元素。
右键单击元素选项卡中的元素
选择复制
复制Xpath
在您的代码中,将By.linkText
替换为By.xpath
将值作为字符串粘贴到xpath("you paste here")
或者更简单,请观看this视频
答案 1 :(得分:1)
在必须切换到框架之前:
H1
然后你可以尝试:
W1
最后,如果你想切换回来:
driver.get("http://spicareers.com/spicareers/");
WebElement frame= driver.findElement(By.xpath("//frame[@name='JRAMPSMainFrame']"));
driver.switchTo().frame(frame);
修改强>
感兴趣的元素位于iframe中,名称为" JRAMPSMainFrame"。如果你检查你的html,你会注意到这一点:
答案 2 :(得分:1)
似乎您选择了错误的框架,或者链接文本可能包含更多空格。
Chrome开发者工具是您在这种情况下最好的朋友。用它来正确找到元素并识别框架。
选择框架
点击开发者工具的控制台标签
在上图中只有一帧。
找到元素
-(void)updateLastMessageSeenTime:(NSString*)groupID
{
FIRDataSnapshot *snapshot = [self.messageArray lastObject];
NSUserDefaults *lastSeenMessageTimeUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *key = @"lastMessageTimeArrayKey";
NSMutableDictionary *lastSeenMessageTime = [[lastSeenMessageTimeUserDefaults objectForKey: key] mutableCopy];
if (!lastSeenMessageTime) {
lastSeenMessageTime = [[NSMutableDictionary alloc] init];
}
NSString *lastMessageTime = snapshot.value[@"timeStamp"];
[lastSeenMessageTime setValue:lastMessageTime forKey:groupID];
NSUserDefaults *lastSeenMessageTimeUserDefaults = [NSUserDefaults standardUserDefaults];
[lastSeenMessageTimeUserDefaults setObject:lastSeenMessageTime forKey: key];
[lastSeenMessageTimeUserDefaults synchronize];
}
以检查xpath。 $x("//a[normalize-space(.) = '.Net - Senior Developer']")
是在浏览器中检查xpath的函数。
使用上述机制找到框架和元素。
干杯!
答案 3 :(得分:0)
如果您仔细查看HTML
http://spicareers.com/spicareers/
WebElement
.Net - Senior Developer
,<iframe>
文字在WebElement
标记内。因此,在访问预期frame
之前,我们必须先通过frame_name
,frame_id
或frame_index
切换到System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.get("http://spicareers.com/spicareers/");
driver.switchTo().frame("JRAMPSMainFrame"); //using "frame_name"
WebElement elem = driver.findElement(By.xpath("//*[contains(text(), ' .Net - Senior Developer ')]"));
elem.click();
,如下所示:
private void parseJsondata(String response) {
try {
// response
JSONObject jsonObject = new JSONObject(response);
// get data from JSONArray
JSONArray data = jsonObject.getJSONArray("data");
// for loop to your JSONArray's Strings
for (int i = 0; i < data.length(); i++) {
// get JSONObject from i
JSONObject jo = data.getJSONObject(i);
// get string
String ean = jo.getString("ean");
String itemname = jo.getString("itemname");
String location = jo.getString("location");
JSONArray jA = jo.getJSONArray("po");
for (int j = 0; j < jA.length(); j++) {
// get JSONObject by jO
JSONObject jO = jA.getJSONObject(i);
// get string
String ponumber = jO.getString("ponumber");
String qty = jO.getString("qty");
}
}
//Log response
Log.e("response:", response);
} catch (JSONException e) {
e.printStackTrace();
}
}
答案 4 :(得分:0)
您可以使用此代码,首先使用name
定位器进入框架,然后尝试找到职业选项
试试这段代码,我修改了你的代码:
public class Framebyindex
{
public static void main(String[] args)
{
WebDriver f1=new FirefoxDriver();
f1.get("http://spicareers.com/spicareers/");
f1.switchTo().frame( f1.findElement(By.name("JRAMPSMainFrame")));
WebElement netCareer= f1.findElement(By.xpath("//*[contains(text(), ' .Net - Senior Developer ')]"));
netCareer.click();
}
}
答案 5 :(得分:0)
使用: https://github.com/nick318/FindElementInFrames
您可以编写以下内容:
SearchByFramesFactory searchFactory = new SearchByFramesFactory(driver);
SearchByFrames searchInFrame = searchFactory.search(() -> driver.findElement(By.xpath("//*[contains(text(), ' .Net - Senior Developer ')]")));
searchInFrame.getElem().ifPresent(WebElement::click);